9

我正在研究 K&R 的“The C Programming Language”,示例 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()' 显示?

4

2 回答 2

23

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

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

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

于 2013-07-09T15:46:53.050 回答
2

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

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

干杯。

于 2013-07-09T15:55:47.763 回答