回答
你需要什么叫做可变数量的参数函数,你可以阅读:9.9. Variable numbers of arguments一个很好的和作文的教程。
四点一短理论将帮助你理解我的代码:该操作
- 的
<stdarg.h>
头文件必须包括在内,他引入了一个新 类型,叫做的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
(读取在主 注释)。在f()
,while(n--)
执行三个 时间和每个循环使用va_arg()
宏我们检索三个 值。 - 如果你注意到我读前两个
ints
然后double
,凡为我 我发送char, int, float
(通知主,我叫F())。 这是因为自动类型在可变参数列表的情况下提升。
她是来自MSDN的另一个更有用的链接:va_arg, va_end, va_start。
(让我知道你是否需要对此更多的帮助)
我可以建议,为了证明传递参数的数量是基于你在代码中指出的'n = 3',那么三组参数''a',3,6.7f',''b',5,5.5f',''A',0,0.1'为结构指针形式:'fun(2,a,b,3, (struct foo){.aa ='a',.i = 3,.f = 6.7f},/ * newline here * /&(struct foo){.aa ='b',.i = 5,.f = 5.5f},/ * newline here * /&(struct foo){.aa ='A',.i = 0,.f = 0.1f});' – Sebivor 2013-04-05 10:25:16
@modifiablelvalue是的,真的很不错建议人。但是对于OP我想保持简单的代码。我包含了不同的数据类型,因为我想演示一下'char'提升为'int','float'提升为'double'。只要。如果你正在编写一个像你一样的代码,然后把代码放在codepas上,并给我链接:) ..谢谢 – 2013-04-05 10:42:05
使用可变参数(自己查看,被调用者读取参数的参数在stdarg.h
)。
请注意,被调用者无法自动确定实际传递的参数数量。因此,举例来说,它可能是n
,你只需要相信来电者获得n
的权利。
- 1. 将多个参数传递给函数
- 2. 将数组传递给函数参数
- 3. 参数传递给函数
- 4. 参数传递给函数
- 5. 将bash函数参数传递给emacs
- 6. 将参数传递给比较函数?
- 7. 将参数传递给JQuery函数
- 8. 将参数传递给函数指针
- 9. javascript/d3 - 将参数传递给函数
- 10. 将参数传递给a4j:函数
- 11. 将参数传递给函数
- 12. 将参数传递给函数?
- 13. VBScript:将参数传递给函数
- 14. Haskell - 将参数传递给map函数?
- 15. 将参数传递给Compose的函数?
- 16. 将参数传递给函数引用?
- 17. 将参数传递给AsyncCallback函数?
- 18. 将宏参数传递给宏函数
- 19. 将参数传递给EventListener函数
- 20. 将参数传递给回调函数
- 21. python Tkinter:将参数传递给函数
- 22. 将参数传递给window.onload函数
- 23. 将参数传递给jQuery函数
- 24. 将参数传递给jQuery函数
- 25. jquery - 将参数传递给函数
- 26. 将参数传递给jQuery函数
- 27. 将参数传递给函数
- 28. 将参数传递给jquery函数
- 29. 将参数传递给函数
- 30. 将日期参数传递给函数
你需要做一个可变参数函数,见http://stackoverflow.com/questions/2735587/in-ac-function-declaration-作为最后一个参数做什么 – Joe 2013-04-05 09:45:17