为什么我的可变参数不能在C中起作用?

时间:2010-12-11 15:24:14

标签: c printf

我正在尝试创建自己的printf函数,但它无法正常工作。输出似乎是正确的格式,但参数似乎没有正确传递,我得到垃圾值。我正在使用GCC。请参阅下面的代码。

void con_printf(char *fmt, char attr, ...)
{
    char *s = printf_buffer;
    va_list args;
    va_start(args, fmt);
    vsnprintf(s, CON_TMPSIZE, fmt, args);
    va_end(args);
    while(*s != '\0')
    {
        con_putchr(*s, attr);
        s++;
    }
    con_flush();
}

printf_buffer定义为CON_TMPSIZE个字节长,在此版本中为128个字节。这适用于小型微控制器,但我希望该原理适用于任何处理器。

我这样称呼它:

con_printf("LOOP a %d\n", 0, 10);
con_printf("LOOP b %d\n", 0, 12);

我期望LOOP在第一行打印10,在下一行打印LO 12,但我得到LOOP 542和LOOP b 542.

1 个答案:

答案 0 :(得分:4)

使用va_start指定变量参数的起始点。

由于函数的变量参数列表在attr之后开始,因此您需要:

va_start(args, attr);