标签:函数参数个数不确定 参数变长函数 c语言 printf支持变长参数原理
定义参数个数不确定的函数,需用到头文件stdarg.h,该头文件是专门为变长参数函数所用。
参数变长函数的声明:void function(int intVal, ...),当然参数类型可以为double或其他,返回类型也可以自己修改。
方法:
先用头文件stdarg.h中的宏va_list定义一个指向参数的指针ap,va_list ap;
再用宏va_start初始化指针ap,va_start(ap,知名变量名intVal);
再用va_arg使指针ap指向下一参数,并且取出该参数,va_arg(ap,取出参数的类型int);
最后所有参数取完后,用va_end清理掉指针ap va_end(ap);
下边是定义一个void minprintf(char *,...)函数,演示标准库函数printf是如何实现变长参数输出的。
/* *************************************************** *test.c *本程序主要目的是学习如何定义变长参数的函数, *通过演示输出函数printf的输出过程体现 *************************************************** */ #include <stdio.h> #include <stdarg.h> /*主要目的为让函数能够接收可变参数*/ int main() { /* *定义一个变长参数的函数,实现对变长参数的调用,输出处理 *第一个参数为字符串,后边参数任意, *对字符串进行分字符输出 */ void minprintf(char *,...); int intA=30; double douB=2.999; char * strC="succeed"; minprintf("intNum is %d,doubleNum is %f,string is %s\n",intA,douB,strC); return 0; } void minprintf(char *str,...) { va_list ap;/*va_list 在C语言中解决变参问题的一组宏,所在头文件:stdarg.h *定义一具VA_LIST型的变量,这个变量是指向参数的指针 */ char *p; int ival;/*定义一个整型变量,储存va_arg返回整型参数的值*/ double dval;/*定义一个浮点变量,储存va_arg返回浮点参数的值*/ char *sval;/*定义一个字符串变量,储存va_arg返回字符串参数的值*/ va_start(ap,str);/*VA_START宏,用最后一个知名变量参数初始化刚定义的VA_LIST变量*/ for(p=str;*p;p++)/*对字符串进行按字符遍历的方法*/ { if(*p!='%')/*对字符串的每个字符进行遍历,未遇到字符%时,原样输出*/ { //printf("%c",*p);//Ok putchar(*p); continue; } switch(*++p) /*p指向%后的一个字符*/ { case 'd': ival=va_arg(ap,int);/*用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型*/ printf("%d",ival); break; case 'f': dval=va_arg(ap,double); printf("%f",dval); break; case 's': //sval=va_arg(ap,char *); //printf("%s",sval); //Ok for(sval=va_arg(ap,char *);*sval;sval++) putchar(*sval); break; default: putchar(*p); break; } } va_end(ap); }
标签:函数参数个数不确定 参数变长函数 c语言 printf支持变长参数原理
原文地址:http://blog.csdn.net/wuyzhen_csdn/article/details/43669571