我正在尝试创建自己的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.
答案 0 :(得分:4)
使用va_start
指定变量参数的起始点。
由于函数的变量参数列表在attr
之后开始,因此您需要:
va_start(args, attr);