以下是我可以想出的将可变长度参数传递给函数的最基本示例:
int printme(int num, ...)
{
va_list ap;
va_start(ap, num);
for (int i = 0; i < num; ++i) {
char *arg = va_arg(ap, char *);
printf("%d. %s\n", i + 1, arg);
}
va_end(ap);
return 1;
}
int main(void)
{
printme(2, "X", "YY");
}
但是,请注意我将长度作为第一个参数(或任何参数)传递。是否可以使用这些va_
带有类似 printf
的宏-ish 功能?例如,我可以做这样的事情(不传递参数的数量?print2("Hello something %s %s", "Arg 1", "Arg 2");
print2("Hello something %s %s %s", "Arg 1", "Arg 2", "Arg 3");
如果是这样,接收那个的函数会是什么样的?如果不可能,如何 printf
实现呢?
最佳答案
如果你只想传递字符串,可以很容易地通过编写一个函数来解析第一个参数,如 countargs(char*)
我在这里写的。它返回参数的数量:
#include <stdarg.h>
#include <stdio.h>
int printme(char* fmt, ...)
{
va_list ap;
int num = countargs(fmt);
va_start(ap, num);
for (int i=0; i < num; ++i) {
char* arg = va_arg(ap, char*);
printf("%d. %s\n", i+1, arg);
}
va_end(ap);
return 1;
}
int countargs(char* fmt)
{
int i, num = 0;
if(strlen(fmt) < 2)
{
return 0;
}
for(i = 0; fmt[i+1] != '\0'; i++)
{
if (fmt[i] == '%' && fmt[i+1] == 's')
{
num++;
}
}
return num;
}
int main(void)
{
printme("%s%s", "Stack", "Overflow");
}
关于c - 使用 va_args 而不传递 num(如 printf),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66502968/