我编写了以下简单的C代码,它编译并运行良好。但它的行为方式我不明白。我输入一个字符,然后将其打印在屏幕上。但当我按下返回键时,它会打印整行。因此,如果我键入字母a,b和c,abc将在命令行上打印两次。为什么会这样做?
#include <stdio.h>
int main(){
int c;
while((c=getchar())!=EOF){
putchar(c);
}
return 0;
}
答案 0 :(得分:5)
因为您的终端是线路缓冲的。
在遇到换行符之前,它不会向你的程序发送数据,虽然它会将字符回显到屏幕上,这样你就可以看到它们击中的键。
答案 1 :(得分:4)
这是你的终端,而不是程序。
当您按某个键时,您的终端会打印它,但不会将其传递给程序。
当您按Enter键时,终端将整行传递给程序,程序将打印该行。
编辑:如果您使用Unix / Linux / etc,您可以编写stty -icanon -echo
来禁用该终端行为。
-echo
关闭打印,-icanon
关闭缓冲。
答案 2 :(得分:0)
您所看到的是一些事情的组合。
因此,您看到的文本来自类型命令,但打印的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