为什么这个C代码有意外的行为

为什么这个C代码有意外的行为,c,getchar,putchar,C,Getchar,Putchar,我已经编写了以下简单的C代码,可以很好地编译和运行。然而,它的行为方式,我不明白。我输入一个字符,它会在屏幕上打印出来。但是当我按下回车键时,它会打印整行。因此,如果我键入字母a、b和c,abc将在命令行上打印两次。为什么会这样 #include <stdio.h> int main(){ int c; while((c=getchar())!=EOF){ putchar(c); } return 0; } #包括 int mai

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

#include <stdio.h>


int main(){


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

return 0;

}
#包括
int main(){
INTC;
而((c=getchar())!=EOF){
普查尔(c);
}
返回0;
}

因为您的终端是行缓冲的


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

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

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

按enter键时,终端将整行传递给程序,程序将打印该行

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

您看到的是一些东西的组合

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

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

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

    尝试此替代代码,您将更好地了解发生了什么:

    #include <stdio.h>
    int main(){
        int c;
        while((c=getchar())!=EOF){
            printf("got char %c\n", c);
        }
        return 0;
    }
    
    #包括
    int main(){
    INTC;
    而((c=getchar())!=EOF){
    printf(“已获取字符%c\n”,c);
    }
    返回0;
    }
    
    您需要非行缓冲输入。这将取决于您的平台,但在Linux上有一个答案: