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;
- }
|