0

我编写了以下简单的 C 代码,可以正常编译和运行。但是它的行为方式我不明白。我输入一个字符,它会在屏幕上打印出来。但是当我按下回车键时,它会打印整行。因此,如果我键入字母 a、b 和 c,abc 会在命令行上打印两次。为什么这样做?

#include <stdio.h>


int main(){


    int c;
    while((c=getchar())!=EOF){
        putchar(c);
    }

return 0;

}
4

4 回答 4

5

因为您的终端是行缓冲的。

它在遇到换行符之前不会将数据发送到您的程序,尽管它会将字符回显到屏幕上,以便您可以看到您按下的键。

于 2012-03-09T14:44:33.710 回答
4

这是您的终端,而不是程序。

当您按下一个键时,您的终端会打印它,但不会将它传递给程序。

当您按下回车键时,终端将整行传递给程序,程序打印该行。

编辑:如果您使用 Unix/Linux/etc,您可以编写stty -icanon -echo以禁用该终端行为。-echo关闭打印,关闭-icanon缓冲。

于 2012-03-09T14:44:33.917 回答
0

你所看到的是几件事的组合。

  1. 当您键入一个字符时,除非您明确阻止它发生,否则它将打印到屏幕上。
  2. 在打印新行之前,大多数打印语句实际上不会打印任何内容。

因此,您看到的文本来自 type 命令,但打印的 putchar() 字符串是同时发生的。

于 2012-03-09T14:45:26.587 回答
0

您正在从行缓冲的标准输入流中读取。

试试这个备用代码,你会更好地理解发生了什么:

#include <stdio.h>
int main(){
    int c;
    while((c=getchar())!=EOF){
        printf("got char %c\n", c);
    }
    return 0;
}

您需要非线性缓冲输入。这将取决于您的平台,但这是 Linux 上的答案:非缓冲标准输入读取

于 2012-03-09T14:48:20.797 回答