为什么这个C代码有意想不到的行为

时间:2012-03-09 14:41:17

标签: c getchar putchar

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

#include <stdio.h>


int main(){


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

return 0;

}

4 个答案:

答案 0 :(得分:5)

因为您的终端是线路缓冲的。

在遇到换行符之前,它不会向你的程序发送数据,虽然它会将字符回显到屏幕上,这样你就可以看到它们击中的键。

答案 1 :(得分:4)

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

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

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

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

答案 2 :(得分:0)

您所看到的是一些事情的组合。

  1. 当您输入字符时,除非您明确地阻止它发生,否则它将打印到屏幕上。
  2. 在打印新行之前,大多数打印报表实际上不会打印任何内容。
  3. 因此,您看到的文本来自类型命令,但打印的putchar()字符串同时发生。

答案 3 :(得分:0)

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

尝试使用此备用代码,您将更好地了解正在发生的事情:

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

您需要非线路缓冲输入。这将取决于您的平台,但这是Linux的答案:non-buffering stdin reading