2010-02-15 42 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循环体不会执行。

相关问题