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

How to tell `getchar()` to go back to the beginning of the buffer?

我正在从 "The C Programming Language" 学习 C,我 运行 进入了 getchar() 的东西,这让我很困惑。显然,当我在程序中调用 getchar() 时,输入的文本被存储在一个缓冲区中,然后 getchar() 一个一个地读取这个缓冲区中的字符,直到它看到 EOF。我可以指示 getchar() 在同一个缓冲区上第二次执行此过程吗?例如,下面程序中的第二个循环对我来说不会 运行 。是否可以在第一个循环后"reset"getchar()

#include <stdio.h>

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

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

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

缓冲的不是getchar(),而是您的终端。一旦您按下 Enter,终端会立即将您键入的整行 发送到您的程序。从你的程序的角度来看,没有缓冲,你只是静坐十秒钟,然后眨眼输入一个完整的句子。

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

后出现

因此,如果你想重用你知道的缓冲区,你需要你的程序通过 fgets() 将它读入它一侧的实际缓冲区,然后根据需要使用该缓冲区。

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

getchar() 不会从流中查看一个字符,但是 消耗 每个调用的一个字符,这意味着 读取和删除流中的字符。 因此,当您在流的末尾时,您会得到一个 eof(文件末尾),通知您其中没有更多字符。

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