标签:
1 for(p = fmt; *p; p++) 2 { 3 if(*p != ‘%‘) 4 { 5 putchar(*p); 6 continue; 7 } 8 i = 0;// 永远指向下一个字符,因为0时也没有字符,可能最终也是没有字符 9 localfmt[i++]=‘%‘; // start local fmt 10 while( *(p+1) && !isalpha(*(p+1)) ) // p 只处理到当前字符 测试下一字符 ++p 测试 p+1 11 // i 处理到下一字符 从0开始添加 使用 i++ 12 localfmt[i++]=*(++p); // collect chars 13 localfmt[i++]=*(p+1); // format letter 14 localfmt[i]=‘\0‘; 15 16 switch(*++p) // format letter 17 { 18 19 } 20 }
#include <stdio.h> #include <ctype.h> #include <stdarg.h> void minprintf(char *fmt, ...) { va_list ap; char *p, *sval; int ival,i; double dval; char localfmt[100]; va_start(ap, fmt); for(p = fmt; *p; p++) { if(*p != ‘%‘) { putchar(*p); continue; } i = 0; localfmt[i++]=‘%‘; while( *(p+1) && !isalpha(*(p+1)) ) localfmt[i++]=*(++p); localfmt[i++]=*(p+1); localfmt[i]=‘\0‘; switch(*++p) { case ‘d‘: ival = va_arg(ap,int); printf(localfmt,ival); break; case ‘f‘: dval = va_arg(ap,double); printf(localfmt,dval); break; case ‘s‘: for(sval = va_arg(ap,char *); *sval; sval++) putchar(*sval); break; default: putchar(*p); break; } } va_end(ap); } int main() { minprintf("% d",10); return 0; }
对于开始存数的使用 i++ 始终指向要写入的位置(已有字符的下一位置),因为可能什么都不写,最后处理到i这个空位置。
对于已有的测试使用下一个字符(p+1),然后先移指针在处理当前字符,++p。
标签:
原文地址:http://www.cnblogs.com/daijkstra/p/4612656.html