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

时间:2013-07-09 15:39:47

标签: c getchar putchar

我正在研究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()'的整行字符来显示?

2 个答案:

答案 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设备如何工作的更多详细信息,可以向我提出更多问题。

干杯。