理论在getchar()和putchar()函数背后

我正在研究K&R的“C编程语言”,例子1.5让我难过:

#include  /* copy input to output; 1st version */ int main(int argc, char *argv[]) { int c; while ((c = getchar()) != EOF) putchar(c); return 0; } 

我知道’getchar()’需要一个’putchar()’字符来显示。 但是,当我在终端中运行程序时,为什么我可以传递’putchar()’的整行字符来显示?

因为您的终端是行缓冲的。 getchar()putchar()仍然只能处理单个字符,但是终端等待将字符提交给程序,直到你输入整行。 然后getchar()逐个从缓冲区中获取字符, putchar()逐个显示它们。

另外 :终端是行缓冲的意思是当遇到换行符时它向程序提交输入。 提交数据块通常更有效,而不是一次提交一个字符。 它还为用户提供了在按Enter之前编辑线的机会。

注意 :可以通过禁用终端的规范模式并在stdin上使用NULL调用setbuf来关闭行缓冲。

是的,你可以实际写任何你想要的东西,只要它不是EOF字符,键盘是一个特殊的I / O设备,它直接通过BIOS工作 ,键盘上键入的字符直接插入缓冲区的缓冲区,在您的情况下由原始getchar()读取,当键入一个句子时,您正在将数据推送到缓冲区,并且getchar()函数处于无限循环中,这就是为什么这样做的原因。

如果您想了解有关IO设备如何工作的更多详细信息,可以向我提出更多问题。

干杯。