You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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是操作系统系统调用,绕过用户态缓冲区,直接将内容写入终端,调用后内容会立即显示。

代码执行时的实际顺序:

  1. printf把"31\n"写入stdout缓冲区,但未立即输出;
  2. 后续所有write调用的内容直接输出到终端;
  3. 程序退出时,系统自动刷新stdout缓冲区,"31\n"才被输出,因此出现在所有内容的末尾。

解决办法

  • 在printf之后手动调用fflush(stdout);强制刷新缓冲区,让内容立即输出;
  • 统一使用write输出(需自行将整数转换为字符串),避免混合两种输出方式导致的顺序问题。

内容的提问来源于stack exchange,提问作者7Ver7dict7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:35:20