C - 传递变量参数

时间:2013-02-20 11:11:35

标签: c variadic-functions

我写的基本上是printf的实现。我想要它,所以你可以在字符串中传递许多字符串,例如:

kprintf("Hello %s", "Goodbye %s", "Farewell\n");

不要问为什么,它可能很疯狂。无论如何,它在查找传递的字符串中有多少%字符后递归调用自身;因此,如果其中包含多个%,则应传递许多参数。但是,我无法用任何优雅来实现这一点,请参阅下面的内容:

case 1:
    kprintf(str, argus[0]);
break;
case 2:
    kprintf(str, argus[0], argus[1]);
break;
case 3:
    kprintf(str, argus[0], argus[1], argus[2]);
break;
case 4:
    kprintf(str, argus[0], argus[1], argus[2], argus[3]);
break;
case 5:
    kprintf(str, argus[0], argus[1], argus[2], argus[3], argus[4]);
break;

使用argus作为指针数组。这有效,但我讨厌它。有没有办法将变量参数传递给函数?

3 个答案:

答案 0 :(得分:3)

有一种类型可以完成你的工作。它被称为“va_list”,您可以使用参数(最多4096,我猜)。要使用它,请包含starg.h - 标题,您需要在函数声明中使用省略号...

int kprintf(int count, ...){
va_list vl;
va_start(vl,count);
for (i=0;i<n;i++)
{
val=va_arg(vl,double);
printf (" [%.2f]",val);
}
va_end(vl);
}

有关示例,请参阅here

答案 1 :(得分:0)

如果您可以使用C ++ here,您可以找到一篇关于变量参数函数的文章,其中包含可下载的源代码,可以解决您的问题。

答案 2 :(得分:0)

虽然可以在传递给%<something>的字符串中编写解析%s的内容,但通常不会在C / C ++中完成它。

如果要将格式化字符串放入printf语句,可以使用sprintf()格式化第一个字符串(在临时缓冲区中),然后将该字符串传递给实际printf功能。是的,这涉及一个额外的步骤,但它使代码更容易 - 如果你正在解析传递到printf的字符串,你几乎必须使printf递归[或者有某种{{} 1}}在printf内部,跟踪你正在做的事情]。