【问题标题】:Character entry causing infinite loop in C字符输入导致C中的无限循环
【发布时间】:2014-06-18 17:12:59
【问题描述】:

好的,所以我在几个地方搜索了这个问题的答案,我在 C++ 中找到了相同问题的答案,但它涉及清除 cin 和那些东西,我不知道如何将其翻译为C。如果这实际上是在其他地方回答的,我提前道歉,我只是错过了它。另外,请记住,我基本上是在自学C,除了您在这段代码中看到的内容之外,我知道的不多。

基本上,我的问题是这样的:我正在运行一个要求输入的循环,然后使用switch 语句来选择发生的情况。 switch 采用int,它适用于任何数字输入。但是,当您输入char 时,它只是无限循环,没有机会输入其他任何内容。

假设这与我查找的 C++ 示例中的问题相同 - 而且我不是 100% 确定它是 - 当我输入 char 时,它会被添加到缓冲区中,并且永远不会得到清除,因此每次循环时都会再次使用无效输入。在C++ 中清除缓冲区似乎很简单,但我在C 中找不到任何我能理解的内容。

这是我的代码,供参考:

int main()
{


  while(1)
  {
    printf("(1-10) -> Run a program | (-1) -> Display menu | (0) -> Quit : ");

    int quit = 0;
    int select;
    scanf("%d", &select);
    switch(select)
    {
      case 1:
        printf("%s", pgmRun);
        helloWorld();
        printf("%s", pgmEnd);
        break;

      //More cases here

      case 0:
        quit = 1;
        break;
      default:
        printf("\n");
        printf("Error: Invalid input\n");
        printf("\n");
    }

    if(quit == 1)
      break;
  }
return 0;
}

提前感谢您的帮助,对于这么长的帖子,我们深表歉意。我倾向于长篇大论。 :P

【问题讨论】:

  • 我建议你read more about scanf,特别是检查它返回的内容。
  • 我会调查的,谢谢。
  • @Floris 从技术上讲,fflush(stdin) 是未定义的行为。并非所有库都支持它。在换行之前获取字符可能会更好。
  • 感谢大家的建议。

标签: c infinite-loop


【解决方案1】:

fflush(stdin) 具有未定义的行为。如果您想丢弃在 scanf() 调用后输入的字符,您可以读取并丢弃它们。
可以使用getchar()清除字符。

【讨论】:

  • 你是对的;我太快了,应该测​​试一下我的建议。
  • 为了完整起见,我建议您编辑答案以显示如何使用 getchar() - 例如 while(scanf("%d", &select)!=1) getchar();
  • 我所做的是将getchar() 插入到switch 语句之后的循环中。
  • 或者,阅读直到你得到\nEOF,在许多情况下,如果当前行有垃圾,丢弃该行的其余部分更有意义。
猜你喜欢
  • 1970-01-01
  • 2012-07-04
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
相关资源
最近更新 更多