【问题标题】:why is scanf causing infinite loop when entering a char different than number? [duplicate]为什么 scanf 在输入与数字不同的字符时会导致无限循环? [复制]
【发布时间】:2019-11-15 19:14:54
【问题描述】:
int main()
{
    int choose, isNum;
    printf("Choose 1,2,3,4,5,6\n");
    isNum = scanf("%d",&choose);
    while(choose != 0){
        if(!isNum || choose > 6){
            printf("Wrong option!\n");
            printf("Choose 1,2,3,4,5,6\n");
            isNum = scanf("%d",&choose);
            continue;
        }

        //6 ifs checking which number have you choose and what it does..

        printf("Choose 1,2,3,4,5,6\n");
        isNum = scanf("%d",&choose);
}}

我从这里尝试了很多东西,flash,cclear,在那一刻,我首先检查它是否是一个数字,然后像许多建议的答案一样使用它,它总是回到同一个无限循环。 我的问题有所不同,因为我尝试了所有答案,正如我所说,它没有帮助,没有 fflush,没有 cclear 并且在使用它之前没有检查它是否是一个数字..

【问题讨论】:

  • 在检查isNum 的值之前,您根本不应该使用变量choose
  • 您需要 (a) 清除阻塞读取的输入的输入缓冲区和 (b) 专门检查 isNum != 1(而不是 !isNum)否则代码将在 @返回 987654326@。请注意,fflush 不应用于输入流。

标签: c scanf infinite-loop


【解决方案1】:

scanf() 就是这样处理无效输入的。我看到您检查 isNum 是否提供了正确的输入,但条件中的 choose 不正确。问题是,如果没有从scanf() 消耗,您所写的内容将留在缓冲区中,这就是导致无限循环的原因。您必须编写代码清除缓冲区,然后再次调用scanf()

清除缓冲区的一种解决方案是这段代码:while ((getchar()) != '\n');

【讨论】:

  • 你的意思是使用 fflush(stdout);功能?因为我已经尝试过了,所以我在每次scanf之前都输入了它,它仍然进入相同的循环。
  • @Asaf stdout 不是您必须清除的流。它是标准输入。但是你可以这样写而不是刷新: while ((getchar()) != '\n');它应该为您清除缓冲区。它消耗缓冲区中剩余的所有内容
  • 谢谢,fflush(stdin) 有效,它是学校的东西,所以我不能使用 getchar 函数,但它与 while(choose != '\n') 有什么不同,因为那不起作用还有,为什么不使用 fflush 很重要?
  • 使用 fflush(stdin) 是未定义的行为。在某些编译器和系统中可能会工作,而在另一些可能不会。请考虑将我的答案标记为已接受。
猜你喜欢
  • 2013-05-28
  • 1970-01-01
  • 2021-06-17
  • 2012-09-27
  • 2016-11-13
  • 2018-11-06
  • 2018-06-25
  • 2012-07-04
相关资源
最近更新 更多