我们以实现函数printf的一个最简单的版本为例,体验下如何以可一直的方式编写可处理变长参数表的函数。因为我们的重点在于参数的处理,所以,函数minprintf只处理格式字符串和参数,格式转换则通过调用函数printf实现
#include <stdio.h>
#include <stdlib.h>
#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("%f",dval);
break;
case 's':
for(sval=va_arg(ap,char *);*sval;sval++)
putchar(*sval);
break;
default:
putchar(*p);
break;
}
}
va_end(ap);
}
int main(int argc,char *argv[])
{
minprintf("%s","hello world!");
return 0;
}