3

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

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

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

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

4

3 回答 3

5

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

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

于 2011-01-01T07:37:38.187 回答
1

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

于 2011-01-01T07:31:42.743 回答
1

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

fflush(NULL);

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

于 2014-05-02T07:41:37.267 回答