为何C语言程序中printf输出的31出现在末尾而非开头?
为什么printf输出的内容位置不符合预期?
问题代码
#include <unistd.h> #include <stdio.h> int ft_strlen(char *c) { int i = 0; while(c[i] != '\0') { i++; } return i; } int main() { char rockPaperScissores[] = "THIS IS rockPaperScissores^tm: "; int rps = ft_strlen(rockPaperScissores); printf("%d\n", rps); write(1, rockPaperScissores, rps); write(1, "LETS PLAY!!!\n", 13); for (int i = 51; i >= 49; i--) { write(1, &i , 1); write(1, "\n" , 1); } return 0; }
实际输出
THIS IS rockPaperScissores^tm: LETS PLAY!!! 3 2 1 31
原因分析
问题核心是标准I/O函数与系统调用的输出缓冲机制差异:
printf是标准C库提供的I/O函数,会使用用户态缓冲区。默认情况下,当stdout连接到终端时为行缓冲模式——本该遇到换行符就刷新缓冲区,但在混合调用标准I/O和系统调用的场景下,缓冲区可能不会立即触发刷新,直到程序退出时才会统一输出缓冲内容。write是操作系统系统调用,绕过用户态缓冲区,直接将内容写入终端,调用后内容会立即显示。
代码执行时的实际顺序:
printf把"31\n"写入stdout缓冲区,但未立即输出;- 后续所有
write调用的内容直接输出到终端; - 程序退出时,系统自动刷新stdout缓冲区,"31\n"才被输出,因此出现在所有内容的末尾。
解决办法
- 在
printf之后手动调用fflush(stdout);强制刷新缓冲区,让内容立即输出; - 统一使用
write输出(需自行将整数转换为字符串),避免混合两种输出方式导致的顺序问题。
内容的提问来源于stack exchange,提问作者7Ver7dict7
相关产品推荐
相关产品推荐

