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
我沒有想過你的問題的全部範圍,但這似乎是更多的代碼比必要的方式。 –