检查switch语句中的字符串结尾

时间:2010-02-15 00:08:02

标签: c++ string switch-statement

我正在编写一个程序,基本上检查一个数字是否为使用switch语句和状态机的赋值的float,double或long double类型。我正在逐步完成我的程序,它一直到最后,除了似乎没有识别字符串终结符'\ 0'。所以我想知道我的代码部分是否正确。我包含了整个代码,但是输入像0.0F一样,它一直到F_END状态,然后不返回TYPE_FLOAT,而是返回NOTFLOATING,我不明白它为什么不进入案例' \ 0':陈述。

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 个答案:

答案 0 :(得分:7)

我只是浏览了你的代码,但是......

所以,靠近顶部,你有这个:

while (*cp != '\0')

然后在那个循环中你有一堆这些:

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

当然,这些案例标签不会被执行,因为如果*cp0,条件*cp != '\0'将评估为false并且循环体将不会执行。