【问题标题】:My if statement is not working in a while loop. After one execution it quits the loop [duplicate]我的 if 语句在 while 循环中不起作用。一次执行后,它退出循环[重复]
【发布时间】:2019-12-16 20:56:36
【问题描述】:

我编写了以下代码,其中随机生成 2 个数字并添加到第三个变量中。然后它要求用户提供准确的答案。目前正确答案总是'A'a1 是实际答案,而a2,a3,a4 是随机生成的答案。

我已经设置条件来查看给出的答案是否在使用 ASCII 值的a,b,c,dA,B,C,D 的范围内。如果不合适,则给出的消息是invalid answer

如果答案是'A''a',它会给出消息"Answer is correct!\nDo you want to play again? (y/n)",否则它会显示"Answer is incorrect!\nDo you want to play again? (y/n)"

任何回答后,它都会询问用户是否要继续。但是在"Do you want to play again?" 之后,即使scanf 函数存在,它也会退出编译器。

我想让它一直重复,直到用户回答除 'y''Y' 之外的任何其他内容。由于char 数据类型不起作用,我尝试使用整数变量“条件”,但仍然没有得到想要的答案。

#include <stdio.h>
#include <conio.h>

void main() {
    int n1, n2, a1, a2, a3, a4, condition = 1;
    char again = 0, answer;
    srand(time(0));

    while (condition == 1) {
        n1 = rand() % 10;
        n2 = rand() % 10;

        printf("\n\n%d + %d=\n\n", n1, n2);

        a1 = n1 + n2;
        a2 = rand() % a1;
        a3 = rand() % a1 + 10;
        a4 = rand() % a1 + 2;

        printf("Your options are:\n\nA) %d\nB) %d\nC) %d\nD) %d\n\n "
               "What is your answer:\n", a1, a2, a3, a4);

        scanf("%c", &answer);

        if (answer > 64 && answer < 69) {
            if (answer == 'a' || answer == 'A') {
                printf("Answer is correct!\nDo you want to play again? (y/n)");
            } else {
                printf("Answer is incorrect!\nDo you want to play again? (y/n)");
            }
        } else if (answer > 96 && answer < 101) {
            if (answer == 'a' || answer == 'A') {
                printf("Answer is correct!\nDo you want to play again? (y/n)");
            } else {
                printf("Answer is incorrect!\nDo you want to play again? (y/n)");
            }
        } else {
            printf("Invalid answer!\nDo you want to play again? (y/n)");
        }

        scanf("%c", &again);

        if (again == 'y' || again == 'Y') {
            condition = 1;
        } else {
            condition = 0;
        }
    }

    getch();
}

【问题讨论】:

  • scanf("%c",&amp;again);--> scanf(" %c",&amp;again);scanf("%c",&amp;answer); --> scanf(" %c",&amp;answer);
  • 将此视为learn how to debug your programs 的最佳时机。使用调试器逐句执行代码,同时监控变量及其值。
  • 对你的代码的一些批评:首先不要像64101那样使用magic numbers。那么如果answer&gt;64 &amp;&amp; answer&lt;69 为真,那么您知道answer == 'a' 为假,因此您无需检查它。并且所有这些代码检查字母都可以更改为单个switch(如果您使用更简单的情况,例如tolower)。
  • @Someprogrammerdude:我同意你的评论,OP应该使用if (isalpha((unsigned char)answer))if (tolower((unsigned char)answer) == 'a')

标签: c if-statement while-loop do-while


【解决方案1】:

改变

scanf("%c",&again);

scanf(" %c",&again);

How to do scanf for single char in C

或阅读下面大卫的评论。

【讨论】:

  • 您应该解释"%c""%[...]" 转换说明符如何不使用前导空格。 ('\n' 是空格)。因此,每次用户按下 [Enter] 并在stdin 中生成一个'\n' 字符时,下一次使用"%c" 转换说明符对scanf 的调用会愉快地接受'\n' 作为用户对下一个问题的输入。您应该通过在转换说明符前面放置文字 space 来解释如何,例如" %c" 您强制删除所有空白字符,以便在下次调用 scanf 时读取所需字符。
  • 是的,你是对的。虽然链接准确地解释了这一点,但我可能已经详细说明了......你的解释也很可爱,所以我会指出这一点。谢谢@DavidC.Rankin :)
【解决方案2】:

这是 scanf 的错误。 你需要在使用 scanf 后使用 getchar() 来避免你的 'Enter' 输入到这个函数。

scanf("%c",&amp;again); ->scanf("%c",&amp;again); getchar()

【讨论】:

  • 这不是“错误”,它是有据可查的行为,具有同样有据可查的解决方案(不涉及getchar)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 2021-04-25
  • 2019-12-03
  • 1970-01-01
  • 2022-01-26
  • 2013-08-16
  • 1970-01-01
相关资源
最近更新 更多