C语言中使用\r转义字符时此前printf输出未显示问题求解
根本原因
这是C语言标准输出(stdout)的行缓冲机制导致的:
默认情况下,输出到终端的stdout采用行缓冲策略,只有满足以下任意一个条件时,缓冲区的内容才会被真正输出到屏幕上:
- 缓冲区被写满
- 遇到换行符
\n - 程序正常退出触发自动刷新
- 主动调用
fflush(stdout)执行手动刷新
你的代码中第一次调用printf("one");时,输出内容没有带换行符,也没有主动刷新缓冲区,因此"one"只是暂存在内存的输出缓冲区中,没有输出到屏幕。后续sleep的1秒过程中缓冲区内容不会被主动推送,sleep结束后输出的\r和"two"同样暂存在缓冲区中,直到程序结束时才统一刷入终端,此时\r已经将同一行的"one"覆盖,最终仅显示"two"。
解决方案
在第一次打印"one"后主动刷新标准输出缓冲区即可,修改后的代码如下:
#include <stdio.h> #include <unistd.h> int main() { printf("one"); fflush(stdout); // 手动刷新缓冲区,将one立刻输出到屏幕 sleep(1); printf("\r"); printf("two"); return 0; }
如果需要频繁实现这类无换行的即时输出,也可以通过setvbuf(stdout, NULL, _IONBF, 0)将标准输出设置为无缓冲模式,不过会牺牲一定的IO性能。
内容的提问来源于stack exchange,提问作者moomoolo
相关产品推荐
相关产品推荐

