如何定义变长参数个数的函数

定义参数个数不确定的函数,需用到头文件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支持变长参数原理)