2
我正在编写一个程序,基本上检查一个数字是否是使用switch语句和状态机的赋值的类型float,double或long double。我正在浏览我的程序,并且它一直到最后,除非似乎无法识别字符串终结符'\ 0'。所以我想知道我的代码部分是否正确。我包含了整个代码,但是有一个像0.0F这样的输入,它一直到达F_END状态,然后不返回TYPE_FLOAT,而是返回NOTFLOATING,我不明白为什么它不输入' \ 0':语句。检查switch语句中字符串的结尾
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语句,是吧?
编辑添加完整的代码和说明。
没什么好说的。你能添加更多的上下文吗?可能你在阅读F后没有推进角色? 而且,不......不需要休息声明。 – BnWasteland
atof函数有什么问题? – t0mm13b
我没有想过你的问题的全部范围,但这似乎是更多的代码比必要的方式。 –