putchar()机制疑问:为何输入后需按回车才输出?
问题解答
先贴出你提供的代码(注意代码里有个小语法错误,while条件里多了一个右括号,编译前需要修正):
#include <stdio.h> int main(){ int c; while((c = getchar()) != EOF){ putchar(c); } }
你遇到的现象是终端行缓冲机制导致的,核心原因如下:
- 默认情况下,终端的输入输出都采用行缓冲模式:输入时,系统不会把你敲的单个字符立刻传给程序,而是攒到你按下回车键后,才把整行内容一次性交给程序处理;
- 对于输出,
putchar()写入的字符会先暂存在标准输出(stdout)的缓冲区里,只有当缓冲区被填满、遇到换行符,或者程序运行结束时,缓冲区里的内容才会被一次性刷新到终端上。
所以你输入字符时,程序根本没立刻拿到输入内容,按下回车后,整行输入被传给程序,程序循环读取每个字符并写入输出缓冲区,而回车对应的换行符刚好触发了输出缓冲区的刷新,这才让你一下子看到所有输入的字符。
如果想要实现输入一个字符就立刻输出一个字符的效果,可以用两种方法:
- 每次调用
putchar()后手动刷新输出缓冲区:
#include <stdio.h> int main(){ int c; while((c = getchar()) != EOF){ putchar(c); fflush(stdout); // 强制刷新输出缓冲区,让内容立刻显示 } }
- 直接关闭标准输出的缓冲:
在程序开头添加设置缓冲的代码,比如:
#include <stdio.h> int main(){ setbuf(stdout, NULL); // 关闭stdout的缓冲 int c; while((c = getchar()) != EOF){ putchar(c); } }
也可以用setvbuf更明确地设置无缓冲模式:
setvbuf(stdout, NULL, _IONBF, 0);
内容的提问来源于stack exchange,提问作者Shadow_Guo
相关产品推荐
相关产品推荐

