我编写了以下简单的 C 代码,可以正常编译和运行。但是它的行为方式我不明白。我输入一个字符,它会在屏幕上打印出来。但是当我按下回车键时,它会打印整行。因此,如果我键入字母 a、b 和 c,abc 会在命令行上打印两次。为什么这样做?
#include <stdio.h>
int main(){
int c;
while((c=getchar())!=EOF){
putchar(c);
}
return 0;
}
因为您的终端是行缓冲的。
它在遇到换行符之前不会将数据发送到您的程序,尽管它会将字符回显到屏幕上,以便您可以看到您按下的键。
这是您的终端,而不是程序。
当您按下一个键时,您的终端会打印它,但不会将它传递给程序。
当您按下回车键时,终端将整行传递给程序,程序打印该行。
编辑:如果您使用 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;
}
您需要非线性缓冲输入。这将取决于您的平台,但这是 Linux 上的答案:非缓冲标准输入读取