4.编写自己的printf函数:#include<stdarg.h> //宏定义在该头文件内
#include<stdio.h> //需要putchar,printf支持(某些类型转化),
void Myprintf(char * format,...)
{
va_list ap; //定义一个va_list变量,用来遍历无名参数表
char *p; //p用于变量 格式化字符串format
char *sval; //存储提取的字符串参数
int ival; //存储提取的整型参数
double dval; //存储提取的浮点型参数
va_start(ap,format); //va_start以最后一个有名参数format为参数,将ap指向第一个无名参数
for(p=format;*p;p++)
{
if(*p!='%')
{
putchar(*p);
continue;
}
switch(*++p)
{
case 'd':
ival=va_arg(ap,int); //va_arg根据int,返回一个int参数,并决定指针偏移的步长(int显然为4)
printf("%d",ival);
break;
case 'f':
dval=va_arg(ap,double); //va_arg返回一个double,指针偏移8
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 n=10;
double m=8.8;
char s[10]="hello";
Myprintf("This is test !\n");
Myprintf("This int : %d \n",n);
Myprintf("This double:%f\n",m);
Myprintf("This string:%s\n",s);
return 0;
}
|