【问题标题】:How to flush the console buffer?如何刷新控制台缓冲区?
【发布时间】:2011-01-01 07:26:00
【问题描述】:

我有一些重复运行的代码:

printf("要继续吗?Y/N: \n");
继续播放 = getchar();

接下来我的代码正在运行,它不会等待输入。 我发现 getchar 在第二次使用 '\n' 作为字符。 我猜这是因为 sdio 有一些缓冲区,所以它保存了最后一个输入,即“Y\n”或“N\n”。

我的问题是,如何在使用 getchar 之前刷新缓冲区,这会使 getchar 等待我的回答?

【问题讨论】:

  • 您使用的是 C 还是 C++?它们不是同一种语言。

标签: c getchar


【解决方案1】:

刷新输入流会导致未定义的行为。

int fflush(FILE *ostream);

ostream 指向输出流或 一个更新流,其中最 最近的操作没有输入, fflush 函数会导致任何未写入的 要交付的该流的数据 到要写入的宿主环境 到文件;否则,行为 未定义。

要正确刷新输入流,请执行以下操作:

int main(void)
{
  int   ch;
  char  buf[BUFSIZ];

  puts("Flushing input");

  while ((ch = getchar()) != '\n' && ch != EOF);

  printf ("Enter some text: ");

  if (fgets(buf, sizeof(buf), stdin))
  {
    printf ("You entered: %s", buf);
  }

  return 0;
}

请参阅 Why fflush(stdin) is wrongFlush the input buffer

【讨论】:

  • 这就是我所做的,我只是想知道是否有更简单的方法
  • 更简单的方法是使用 fflush,它可能不适用于所有环境和所有情况。
  • 您可以使用特定于您平台的库来处理用户输入(WIN32、GTK、ncurses 等),这将对您隐藏这些细节。
【解决方案2】:

在 printf 之前使用 fflush() 和 flushall()

【讨论】:

    【解决方案3】:

    据我所知,flushall 不是 POSIX。为了以标准方式刷新控制台缓冲区,您可以简单地使用以下命令:

    fflush(NULL);
    

    这个话题似乎有点老了,但我希望这仍然可以帮助其他人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-15
      • 2017-03-09
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 2021-09-03
      相关资源
      最近更新 更多