如何将多个参数传递给C函数? 假设我有这个功能:
void f(int n, char* a, char* b, ...)
我想要一个未定义数量的char *参数。我怎么能这样做?
答案 0 :(得分:3)
您需要的是可变数量的参数函数,您可以阅读:9.9. Variable numbers of arguments一篇优秀的论文教程。
简短的四点理论将帮助您理解我的代码:
<stdarg.h>
头文件,他介绍了一个新文件
type,称为va_list,以及对对象进行操作的三个函数
这种类型,称为va_start, va_arg, and va_end
。va_start:
是一个将arg_ptr
设置为列表ap
的开头的宏
可选参数va_arg:
确实使用这个保存的堆栈指针,然后解压缩
提供的类型的正确字节数va_end:
是一个重置ap
的宏,在完成所有参数之后
检索到,va_end
将指针重置为NULL。这个理论是不够的,但是在一个例子下(如你所要求的)将帮助你理解基本的工作流程和步骤:( 阅读每4个步骤的评论)
//Step1: Need necessary header file
#include <stdarg.h>
void f(int first, char* a, char* b, ...){
va_list ap; // vlist variable
int n; // number
char aa,
int i;
float f;
//print fix numbers of arguments
printf("\n %d, %s, %s\n", first, a, b);
//Step2: To initialize `ap` using right-most argument that is `b`
va_start(ap, b);
//Step3: Now access vlist `ap` elements using va_arg()
n = va_arg(ap, int); //first value in my list gives number of ele in list
while(n--){
aa = (char)va_arg(ap, int); // notice type, and typecast
i = va_arg(ap, int);
f = (float)va_arg(ap, double);
printf("\n %c %d %f \n", aa,i, f);
}
//Step4: Now work done, we should reset pointer to NULL
va_end(ap);
}
int main(){
char* a = "Aoues";
char* b = "Guesmi";
f(2, a, b, 3, 'a', 3, 6.7f, 'b', 5, 5.5f, 'A', 0, 0.1);
// ^ this is `n` like count in variable list
return 1;
}
它是谁运行的:
~$ ./a.out
2, Aoues, Guesmi
a 3 6.700000
b 5 5.500000
A 0 0.100000
我的代码的简要说明将对未来的用户有所帮助:
char* b
中f()
的参数列表仅使用
初始化可行列表ap
。f()
读取n
3
的值{<1}}
主要评论)。在f()
中,while(n--)
执行三次
时间和每次循环使用va_arg()
宏我们检索三个
值。ints
,那么就是double
,我在哪里
我发送char, int, float
(通知我在主叫我f()的地方。
这是因为在变量参数列表的情况下自动类型提升。
(从上面的lisk中详细阅读)她是来自MSDN的另一个有用的链接:va_arg, va_end, va_start。
(如果您需要更多关于此的帮助,请告诉我们)
答案 1 :(得分:0)
使用varargs(自己查看一下,被调用者用来读取args的东西在stdarg.h
)。
请注意,被调用者无法自动确定实际传递的参数数量。例如,它可能是n
,您只需要相信来电者就可以n
正确。