2010-02-15 55 views
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語句,是吧?

編輯添加完整的代碼和說明。

+1

沒什麼好說的。你能添加更多的上下文嗎?可能你在閱讀F後沒有推進角色? 而且,不......不需要休息聲明。 – BnWasteland

+0

atof函數有什麼問題? – t0mm13b

+0

我沒有想過你的問題的全部範圍,但這似乎是更多的代碼比必要的方式。 –

回答

7

我只脫脂你的代碼,但是......

所以,在頂部附近你有這樣的:

while (*cp != '\0') 

然後就是循環內你有一大堆的這些:

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

當然,這些案例標籤不會被執行,因爲如果*cp0條件*cp != '\0'將計算爲false並且th e循環體不會執行。

相關問題