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

带可变参数的infoPrint函数打印蓝色文本时参数42为何变为0?

问题根源:可变参数没有正确传递

哦,这个坑我踩过好多次了!你的问题出在可变参数的处理方式上——虽然你在函数声明里加了...表示支持可变参数,但你直接调用printf(msg)的时候,根本没把后续的参数(也就是那个42)传递给printf!

为什么会输出0?

当你调用infoPrint("Show value: %d.\n", value)时,value确实被压到了栈里,但你的infoPrint函数里的printf(msg)只知道要读一个%d对应的整数,它会从栈上的“预期位置”去取这个数——可你没把value传给它啊!所以它读到的是栈上的某个随机值(这次刚好是0,换个环境可能是别的奇怪数字)。

正确的实现方式

要处理可变参数,你得用C标准库的<stdarg.h>里的工具,比如va_list、va_start、va_end,还有专门的vprintf函数(它就是用来接收可变参数列表的printf变体)。修改后的代码如下:

#include <stdio.h>
#include <stdarg.h>

#define KBLU "\x1B[34m"
#define KWHT "\x1B[37m"

void infoPrint(char* msg, ...) {
    va_list args;
    // 初始化参数列表,第二个参数是可变参数前的最后一个固定参数
    va_start(args, msg);
    
    printf("%s", KBLU);
    // 用vprintf传递参数列表,这样格式化字符串就能正确拿到所有参数了
    vprintf(msg, args);
    printf("%s", KWHT);
    
    // 清理参数列表
    va_end(args);
}

现在再调用infoPrint("Show value: %d.\n", 42),就能正确输出蓝色的Show value: 42.了!

额外提醒

如果你的格式化字符串里有多个参数(比如infoPrint("%s is %d years old.\n", "Alice", 25)),这个实现也能完美处理,因为va_list会把所有后续参数都传递给vprintf。

内容的提问来源于stack exchange,提问作者Moritz Schmidt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:42:40