我写的基本上是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
作为指针数组。这有效,但我讨厌它。有没有办法将变量参数传递给函数?
答案 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内部,跟踪你正在做的事情]。