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