我正在研究K& R的“C编程语言”,例子1.5让我难过:
#include <stdio.h>
/* 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()'的整行字符来显示?
答案 0 :(得分:20)
因为您的终端是行缓冲的。 getchar()
和putchar()
仍然只能处理单个字符,但终端会等待将字符提交给程序,直到您输入整行。然后getchar()
逐个获取该缓冲区中的字符,putchar()
逐个显示它们。
添加:终端是行缓冲的,意味着当遇到换行符时,它会向程序提交输入。提交数据块通常更有效,而不是一次提交一个字符。它还为用户提供了在按Enter键之前编辑行的机会。
注意:可以通过在NULL
上停用canonical mode for the terminal并使用stdin
拨打setbuf来关闭线路缓冲。
答案 1 :(得分:2)
是的,你可以实际写任何你想要的东西,只要它不是EOF字符,键盘是一个特殊的I / O设备,它直接通过BIOS工作,键盘上键入的字符直接插入在缓冲区中,这个缓冲区在你的情况下是由原语getchar()读取的,当你输入一个句子时你正在将数据推送到缓冲区,而getchar()函数处于一个无限循环中,这就是为什么这样做的原因。 p>
如果您想了解有关IO设备如何工作的更多详细信息,可以向我提出更多问题。
干杯。