2010-02-15 9 views
2

기본적으로 스위치 문과 상태 시스템을 사용하여 숫자가 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 문이 필요하지 않습니다 내가합니까?

전체 코드 및 설명을 추가로 편집했습니다.

+1

계속 진행하십시오. 컨텍스트를 추가 할 수 있습니까? F를 읽은 후 캐릭터를 전진시킬 수 없습니까? 그리고, 아니요 ... break 문은 필요 없습니다. – BnWasteland

+0

atof 함수의 문제점은 무엇입니까? – t0mm13b

+0

나는 당신의 문제의 전체 범위를 생각하지 못했지만, 이것은 필요한 것보다 더 많은 코드처럼 보입니다. –

답변

7

나는 단지 상단이 있고,

그래서 ... 코드를 미끄러 져 있지만했습니다

다음
while (*cp != '\0') 

그 루프 내에서 당신은 이들의 무리가 있습니다

switch (*cp) 
{ 
    // snip 
case '\0': 
    // snip 
} 

당연히 이러한 사례 레이블은 실행되지 않을 것입니다. 왜냐하면 *cp0 일 경우 조건 *cp != '\0'은 false로 평가 될 것이고 th e 루프 본문이 실행되지 않습니다.

관련 문제