该程序接受有限数量的整数,并使用va_arg提供的宏输出它们。 (stdargs)
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
void main()
{
foo(5,3,4);
}
void foo(int i,...){
va_list argp;
va_start(argp,i);
int p;
while ((p = va_arg(argp,int))!= NULL)printf("%d",p);
va_end(argp);
}
然而,虽然没有出现编译/语法错误但我没有得到我想要的输出。我在bash上运行了这个:
如何修复我的程序,以便获得:5,3,4?
答案 0 :(得分:4)
你需要传递一个显式的最后一个值并停止它,因为va_arg
无法检测到参数的结束。
#include <stdarg.h>
#include <stdio.h>
void foo(int i, ...) {
va_list argp;
va_start(argp, i);
do {
printf("%d\n", i);
} while ((i = va_arg(argp, int)) != -1);
va_end(argp);
}
int main() {
foo(5, 3, 4, -1);
return 0;
}
输出:
5
3
4
答案 1 :(得分:2)
你需要以某种方式弄清楚参数的数量,因为va_arg
并不神奇地知道它。如果您要将NULL
用作sentinel value,请将NULL
作为列表中的最后一个参数传递。
foo(5,3,4, NULL);
其次,你忽略了第一个参数i
,所以它只打印出34
。如果您的意思是使用i
作为传递的参数数量,那么请使用for循环。
其他小事:
int main()
代替void main() void foo(int i,...);
。