您的位置:首页 > 编程语言

代码写的少,搞不清边界和起始

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: