定义参数个数不确定的函数,需用到头文件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);
}