我正在编写一个程序,基本上检查一个数字是否为使用switch语句和状态机的赋值的float,double或long double类型。我正在逐步完成我的程序,它一直到最后,除了似乎没有识别字符串终结符'\ 0'。所以我想知道我的代码部分是否正确。我包含了整个代码,但是输入像0.0F一样,它一直到F_END状态,然后不返回TYPE_FLOAT,而是返回NOTFLOATING,我不明白它为什么不进入案例' \ 0':陈述。
StatusCode DetectFloats(const char *cp)
{
enum States {
START,
NO_WHOLE,
WHOLE,
FRACT,
EXPONENT,
PLUS_MINUS,
DIGIT,
F_END,
L_END
} state = START;
while (*cp != '\0') {
switch (state) {
case START:
switch (*cp) {
case '.':
state = NO_WHOLE;
break;
default:
if (isdigit(*cp)) {
state = WHOLE;
}
else {
return NOTFLOATING;
}
break;
}
break;
case WHOLE:
switch (*cp) {
case '.':
state = FRACT;
break;
case 'e':
case 'E':
state = EXPONENT;
break;
default:
if (isdigit(*cp)) {
state = WHOLE;
}
else {
return NOTFLOATING;
}
break;
}
break;
case FRACT:
switch (*cp) {
case 'f':
case 'F':
state = F_END;
break;
case 'l':
case 'L':
state = L_END;
break;
case 'e':
case 'E':
state = EXPONENT;
break;
case '\0':
return TYPE_DOUBLE;
default:
if (isdigit(*cp)) {
state = FRACT;
}
else {
return NOTFLOATING;
}
break;
}
break;
case EXPONENT:
switch (*cp) {
case '+':
case '-':
state = PLUS_MINUS;
break;
default:
if (isdigit(*cp)) {
state = DIGIT;
}
else {
return NOTFLOATING;
}
break;
}
break;
case PLUS_MINUS:
switch (*cp) {
default:
if (isdigit(*cp)) {
state = DIGIT;
}
else {
return NOTFLOATING;
}
break;
}
break;
case DIGIT:
switch (*cp) {
case 'f':
case 'F':
state = F_END;
break;
case 'l':
case 'L':
state = L_END;
break;
case '\0':
return TYPE_DOUBLE;
default:
if (isdigit(*cp)) {
state = DIGIT;
}
else {
return NOTFLOATING;
}
}
break;
case F_END:
switch (*cp) {
case '\0':
return TYPE_FLOAT;
break;
default:
return NOTFLOATING;
}
break;
case L_END:
switch (*cp) {
case '\0':
return TYPE_LDOUBLE;
default:
return NOTFLOATING;
}
break;
}
cp++;
}
}
另外,我的代码设置原样,如果我有一个return语句,我不需要break语句吗?
编辑添加完整代码和澄清。
答案 0 :(得分:7)
我只是浏览了你的代码,但是......
所以,靠近顶部,你有这个:
while (*cp != '\0')
然后在那个循环中你有一堆这些:
switch (*cp)
{
// snip
case '\0':
// snip
}
当然,这些案例标签不会被执行,因为如果*cp
为0
,条件*cp != '\0'
将评估为false并且循环体将不会执行。