如何告诉`getchar()`回到缓冲区的开头?

时间:2015-07-27 10:50:16

标签: c getchar

我正在学习C编程语言" C编程语言"我遇到了getchar()让我感到困惑的事情。显然,当我在程序中调用getchar()时,输入文本存储在缓冲区中,然后getchar()逐个读取此缓冲区中的字符,直到看到EOF。我可以指示getchar()在同一个缓冲区上第二次执行此过程吗?例如,以下程序中的第二个循环不会为我运行。是否有可能重置"第一次循环后getchar()

#include <stdio.h>

int main()
{ int c,d;
  c = d = 0;

  while((c = getchar()) != EOF) printf("foo");

  while((d = getchar()) != EOF) printf("bar");
}

2 个答案:

答案 0 :(得分:3)

它不是getchar()缓冲的,而是你的终端。点击 Enter 后,终端会立即将您输入的整行发送到您的程序。从你的节目的角度来看,没有缓冲区,你只是静坐十秒钟,然后眨眼就输入一整句话。

你可以通过制作一个getchar()的循环来验证它,并输出它立即收到的字符:输出将与输入交错,它将只有在您按下 Enter

后才会显示

因此,如果要重用已知的缓冲区,则需要程序通过fgets()将其读入实际缓冲区,然后根据需要使用该缓冲区。

答案 1 :(得分:2)

为简单起见,getchar()不会在缓冲区中读取,而是在键盘输入流中读取,通常称为 stdin (标准输入)。

getchar()不会从流中查看char,但消耗每个调用的char,这意味着 read&amp;从流中删除字符。 因此,当您在流的末尾时,您将获得一个eof(文件结尾),通知您其中没有更多字符。

然后stdin通常是行缓冲,这意味着一个完整的输入行,一系列由换行符终止的字符,在时间上可用。