C语言中循环和条件语句出现问题

4
EDIT2: 我自己解决了问题,将第38行和第56行的 answer = getchar(); 替换成 scanf("%d", &answer);,问题得到了解决,但我不知道为什么。

修复版本:

Do you order Fish? (Y/N): g
Please enter Y or N only: g
Please enter Y or N only: g
Please enter Y or N only: g
Please enter Y or N only: y
Fish choice (K- Haddock, T- Halibut): x
Please enter K or T only: x
Please enter K or T only: x
Please enter K or T only: x
Please enter K or T only: k
What size (L - Large, M - Medium, S - Small): x
Please enter S, M, or L only: x
Please enter S, M, or L only: x
Please enter S, M, or L only: x
Please enter S, M, or L only: l
How many orders do you want? (>=0): 2

编辑:

如果您要编译并查看源代码,请使用以下链接获取完整源代码: http://pastebin.com/raw.php?i=83y0SLHQ

目前,下面的所有内容都可以正常工作,但是现在出现了一个新问题:

输出结果:

Do you order Fish? (Y/N): y
Please enter Y or N only: n
Fish choice (K- Haddock, T- Halibut): s
Please enter K or T only: K
What size (L - Large, M - Medium, S - Small): x
Please enter S, M, or L only: L
How many orders do you want? (>=0): 2
问题: 注意,如果我输入 y 作为选项,即使它是有效的,它也会告诉我再次输入 Y 或 N?它不应该这样做。所有其他循环都有效,除了第一个带有(Y/N)的循环。
我进行了一些调试,并在第一行后打印了 rc 的值,其 ASCII 值为 10,这意味着我的 answer 值实际上读取了 \n,然后只有在第二个提示之后,它才读取正确的 ASCII 值 y 并进行比较。
为什么它首先接受 \n

旧文章

我有一个程序,需要验证用户的输入。如果用户输入 "y"、"Y"、"n" 或 "N",则它们通过验证。如果他们输入任何其他字符,则程序输出: 请只输入 Y 或 N
我为此编写了一个 verify 函数。像这样传递值:
如果我只想验证字符 YNyn,则可以这样做: verify("YNyn", 2); YNyn 是我想要验证的字符,2 是大写字符的数量。
在我的 verify 函数中,我查看我的第二个参数是否等于 2 或 3。(如果我有 verify("SMLsml", 3);,则为 3,SML 是小中大)。
我添加了 printf 来查看我 verify 函数中第一个参数的 ASCII 值,它们都正确对应。 输出: 这意味着 Y 是 89,N 是 78,y 是 121,n 是 110。- 是我输入的值(Y)的值。-1 是变量 rc 的值。
Do you order Fish? (Y/N): Y

Y:89 N:78 y:121 n:110 - answer:89 rc:-1

问题: 如果语句没有通过验证,rc就不会被设置为1。

if ((answer == validAnswers[0])
 || (answer == validAnswers[1])
 || (answer == validAnswers[2])
 || (answer == validAnswers[3]))
  { rc = 1; }

我也尝试过:

if (answer == validAnswers[0]
|| answer == validAnswers[1]
|| answer == validAnswers[2]
|| answer == validAnswers[3]) {rc = -1 }

但是无济于事,我已经尝试将if语句重新格式化为一行,但没有成功。
这意味着,如果我输入的值对应于Y、N、y或n的ASCII值,则变量rc应该设置为1。不幸的是,它并没有做到这一点,问题在于if语句中。
正如你在上面看到的,在“89 78 121 110 - 89 -1”中,最后一个值(变量rc)的值为-1。这意味着我的if语句被省略了。为什么它们被省略而没有将rc设置为-1呢? 验证函数
int verifyLoop(char *validAnswers, int numChars) {

    int answer, rc = -1;

    if (numChars == 2) {

    answer = getchar();

        do {printf("\n%d %d %d %d - %d %d\n", validAnswers[0],validAnswers[1],validAnswers[2],validAnswers[3], answer, rc);
            answer = getchar();
            if ((answer == validAnswers[0])
             || (answer == validAnswers[1])
             || (answer == validAnswers[2])
             || (answer == validAnswers[3]))
            { rc = 1; }
            if (rc == -1 && answer != -1) 
            {
                printf("Please enter %c or %c only: ", validAnswers[0], validAnswers[1]);
                while (answer != -1 && answer != '\n')
                    answer = getchar();
            } 
        } while (rc == -1 && answer != -1);
    }
    else if (numChars == 3) {

    answer = getchar();

        do {printf("\n%d %d %d %d %d %d - %d\n", validAnswers[0],validAnswers[1],validAnswers[2],validAnswers[3],validAnswers[4],validAnswers[5], answer);
            answer = getchar();
            if (answer == validAnswers[0] 
             || answer == validAnswers[1] 
             || answer == validAnswers[2]
             || answer == validAnswers[3]
             || answer == validAnswers[4]
             || answer == validAnswers[5])
            { rc = 1; }
            if (rc == -1 && answer != -1) 
            {
                printf("Please enter %c, %c, or %c only: ", validAnswers[0], validAnswers[1], validAnswers[2]);
                while (answer != -1 && answer != '\n')
                    answer = getchar();
            } 
        } while (rc == -1 && answer != -1);
    }

}

2
在提问之前先进行一些调试(这似乎是 Stack Overflow 上非常罕见的特质),这是一个好习惯。但你应该继续沿着这条路走;添加更多的打印语句(例如,answer 的值是多少?)。 - Oliver Charlesworth
1
如果您想要简化和通用化在字符串中查找一个字符的操作,请看一下 strchr() 函数。 - Brian Swift
这是因为你在循环开始之前的第一个getChar()调用吃掉了正确答案并留下了一个换行符。只需摆脱它,问题就会得到解决。 - lnafziger
这个问题很混乱。问题在哪里,答案在哪里?现在有很多编辑内容,很难分清什么应该放在哪里。请修复它。 - Lightness Races in Orbit
走开,Lightness。不确定你为什么决定挖坟我的帖子并评论它们。 - eveo
显示剩余7条评论
2个回答

3

之所以它报告 -1 并且没有任何错误是因为它实际上正在工作。

然而,它报告 -1 是因为你的 printf 位于循环顶部,并在 if 语句和将 rc 设置为 1 之前打印了该值。

将你的 printf 移动到循环结尾的正上方,以查看正确的值。


谢谢,已经修复了!现在又出现了另一个问题 -_- - eveo

-1

在print之后有一个getchar,那么你不是在比较第一个getchar的值,而是从第二个开始比较。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接