如何编写一个带有可变数量参数(整数)的函数并使用stdargs输出它们?

时间:2014-09-11 21:22:36

标签: c bash

该程序接受有限数量的整数,并使用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上运行了这个:

enter image description here

如何修复我的程序,以便获得:5,3,4?

2 个答案:

答案 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,...);