分类: C/C++
2012-03-31 22:11:32
源码:
//loop variational parameters disposal
#include
#include
#include
void deal(char *fmt,...);
int main()
{
deal("%s 1%d %s %c","I love linux",2011,"Five years",'y');
return EXIT_SUCCESS;
}
void deal(char *fmt,...)
{
va_list pp;
char cc,*str = NULL;
int dd;
printf("fmt is %s\n",fmt);
va_start(pp,fmt);
while(*fmt)
{
putc(*fmt,stdout);
switch(*fmt++)
{
case 's':
str = va_arg(pp,char *); // type va_arg(va_list ap, type);
printf("string is %s\n",str);
break;
case 'd':
dd = va_arg(pp,int);
printf("int is %d\n",dd);
break;
case 'c':
cc = va_arg(pp,int); //char will be promote to int
printf("char is %c\n",cc);
break;
default:
printf("*\n"); //如果没有匹配选项,打印一个字符注释
}
}
va_end(pp);
}
编程小结:
可变参数处理
可变参数处理有两种情况:
1)命令运行时带参数,即运行可执行程序时的参数,这里一般用argv[i]来处理第i个参数;
2)程序内部的函数调用时的参数,一般使用va_list存储可变参数,使用va_函数来处理。
函数调用的可变参数处理
我的理解是va_list可能就是一个栈,可以用来存储可变参数。
va_list pp; //首先定义一个栈,用于接收可变参数
va_start(pp,fmt); //将可变参数挂在栈上,地址映射?
if(*fmt == 's')
str = var_arg(pp,char *); //参数格式遇到%s中的s就去栈中取字符串
if(*fmt == 'd')
dd = var_arg(pp,int); //参数格式遇到%d中的d就去栈中取整数
va_end(pp); //使用完毕,清除栈