기본적으로 스위치 문과 상태 시스템을 사용하여 숫자가 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를 읽은 후 캐릭터를 전진시킬 수 없습니까? 그리고, 아니요 ... break 문은 필요 없습니다. – BnWasteland
atof 함수의 문제점은 무엇입니까? – t0mm13b
나는 당신의 문제의 전체 범위를 생각하지 못했지만, 이것은 필요한 것보다 더 많은 코드처럼 보입니다. –