变长参数表
c语言给出处理变长参数的语法,
(1)在标准头文件<stdarg.h>中包含一组宏定义
(a)va_list类型用于声明一个变量ap,该变量依次引用各个参数。
例如 val_list ap;
(b)宏va_start将参数指针ap初始化,初始化为指向第一个无名参数的指针。该宏的输入参数值为参数指针ap,最后一个有名参数的指针。
例如:va_start(ap,fmt);
(c)函数va_arg,作用为将ap指向下一个参数。参数为参数指针ap,类型名;返回值为确定类型的参数值。
例如:va_arg(ap,int)返回的类型为int,值为
va_arg(ap,double)返回的类型为double,值
(2)给出一个例子,实现简化的printf函数。
#include <stdarg.h>
void minprintf(char *fmt,...)
{
va_list ap;
char *p;*sval;
int ival;
double dval;
va_start(ap,fmt);
for(p=fmt;*p;p++)
{
if(*p!='%')
{
putchar(*p);
continue;
}
switch(*++p)
{
case 'd':
ival=va_arg(ap,int);
printf("%d",ival);
break;
case 'f':
dval=va_arg(ap,double);
printf("%d",dval);
break;
case 's':
for(sval=va_arg(ap,char *);*sval;sval++)
{
putchar(*sval);
}
break;
default:
putchar(*p);
break;
}
}
va_end(ap);
}
该例子中用ap遍历变长的参数,为参数指针,指向的是参数类型。
指针p指向的是第一个有名参数,为一个字符串。
当用p遍历该字符串的时候。对应着ap遍历参数。