1

我基本上是在写一个printf. 我想要它,以便您可以在字符串中传递许多字符串,例如:

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

不要问为什么,这很可能是疯了。无论如何,它会在查找它传递的字符串中有多少个 % 字符后递归调用自己;因此,如果其中超过 1%,它应该传递许多参数。但是,我无法以任何优雅的方式实现这一目标,请参见以下内容:

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指针数组。这行得通,但我讨厌它。有没有办法将变量参数传递给函数?

4

3 回答 3

3

有一种类型可以做你的工作。它被称为“va_list”,你可以给它提供参数(我猜最多 4096 个)。为了使用它,包含starg.h-header 并且您需要...在函数声明中使用省略号。

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);
}

有关示例,请参见此处。

于 2013-02-20T11:18:14.740 回答
0

如果你会使用 C++,在这里你可以找到一篇关于可变参数函数的文章,带有可下载的源代码,应该可以解决你的问题。

于 2013-02-20T11:17:14.127 回答
0

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

如果要将格式化的字符串放入printf语句中,请使用sprintf()格式化第一个字符串(在临时缓冲区中),然后将该字符串传递给实际printf函数。是的,这涉及一个额外的步骤,但它使代码更容易 - 如果您正在解析传递给 的字符串printf,您几乎必须进行printf递归[或在 printf 中包含某种内容stack,以跟踪您在做什么]。

于 2013-02-20T11:41:23.043 回答