最近在看一份代码,想定义一些自己的打印信息。但是其中涉及到C语言可变参数的编程,虽然之前了解相关的内容,但还不是很熟练,不得不重新温故一下。如下代码很多原理还说不上来,权当记录基本的用法。
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void print_arg(int num,va_list arg);
float average(int num, ...);
int main()
{
printf("The average is: %f\n",average(5,1,2,3,4,5));
return 0;
}
float average(int num, ...){
float avrg;
int i;
va_list args, args2print; //va_list是一种数据类型,该类型变量可以指向一个可变参数列表。
va_start(args, num);//va_start的主要功能就是将args指向可变参数列表,第二个参数num是函数原形中省略号前一个参数。
va_copy(args2print, args);//拷贝一份参数列表
print_arg(num, args2print);
for(i=0;i<num;i++){
avrg += va_arg(args,int);//va_arg的主要作用就是根据类型(第二个参数指定)取args所指列表的当前成员,并将args指向下一个成员。
}
va_end(args);//做收尾工作。还说不清楚具体原理,相信水很深,如果哪位知道请告诉我。
avrg /= num;
return avrg;
}
void print_arg(int num,va_list arg){
int i;
char fmt[50];
strcat(fmt,"args:");
for(i=0;i<num;i++){
strcat(fmt," %d");
}
strcat(fmt,"\n");
vprintf(fmt,arg);//类似于printf,只不过arg是一个参数列表。
}