代码写的少,搞不清边界和起始
2015-07-01 10:48
113 查看
for(p = fmt; *p; p++) { if(*p != '%') { putchar(*p); continue; } i = 0;// 永远指向下一个字符,因为0时也没有字符,可能最终也是没有字符 localfmt[i++]='%'; // start local fmt while( *(p+1) && !isalpha(*(p+1)) ) // p 只处理到当前字符 测试下一字符 ++p 测试 p+1 // i 处理到下一字符 从0开始添加 使用 i++ localfmt[i++]=*(++p); // collect chars localfmt[i++]=*(p+1); // format letter localfmt[i]='\0'; switch(*++p) // format letter { } }
#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。
相关文章推荐
- java中如何将string 转化成long
- LeetCode_69---Sqrt(x)
- javascrip中setTimeout和setInterval
- Core Java读书笔记之String
- 像写SQL一样编写Java数据应用-TinySqlDsl
- PHP+MYSQL中文乱码问题
- 【设计模式】代理模式详解
- 《Java课程实习》日志(周二)
- C#算法之判断一个字符串是否是对称字符串
- Java学习篇之---Maven打包资源配置
- 检测到在集成的托管管道模式下不适用的 ASP.NET 设置。
- Qt获取窗口信息
- C++中命名空间
- java创建token
- 织梦导航标签调用
- 《Java课程实习》日志(周一)
- 初探浅拷贝与深拷贝
- 《Java程序设计》实训每天一博文之第一天
- Eclipse4.4 安装java反编译插件Eclipse Class Decompiler
- java线程的生命周期有哪些