【问题标题】:Why won't my varidic arguments work in C?为什么我的可变参数在 C 中不起作用?
【发布时间】:2010-12-11 15:24:13
【问题描述】:

我正在尝试创建自己的 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 a 10 打印在第一行,LOOP b 12 打印在下一行,但我得到 LOOP a 542 和 LOOP b 542。

【问题讨论】:

  • 请告诉我们调用者,以及传入的参数。
  • @EvilTeach - 添加调用者代码

标签: c printf


【解决方案1】:

使用您指定的va_start,变量参数从该点开始。

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

va_start(args, attr);

【讨论】:

  • 感谢您的建议,但仍然无法正常工作。输出与以前相比没有改变。
  • 嗯。我启动了我的虚拟机,运行了该代码,它给了我预期的结果。你的代码是在什么机器上编译的?
  • 它在微控制器上运行,dsPIC33FJ128GP802。
  • 好吧,Thomas,你能不能尝试切换函数参数(即先 attr,然后 fmt),然后再试一次。如果没有变化,我和你一样迷茫……
猜你喜欢
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
相关资源
最近更新 更多