gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:05:29 27 4
gpt4 key购买 nike

我正在编写一个程序,主要使用 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 语句,对吗?

编辑以添加完整代码和说明。

最佳答案

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

所以,在顶部附近你有这个:

while (*cp != '\0')

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

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

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

关于c++ - 检查 switch 语句中的字符串结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2263399/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com