zoukankan      html  css  js  c++  java
  • 代码写的少,搞不清边界和起始

     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]='';
    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]='';
                
            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。

  • 相关阅读:
    RegExp实例
    Date类型之组件方法
    Date类型之继承方法
    数组常见方法下
    Math对象
    数组常见方法上
    CSS变量
    基本类型和引用类型
    Python习题集(十五)
    Python习题集(十四)
  • 原文地址:https://www.cnblogs.com/daijkstra/p/4612656.html
Copyright © 2011-2022 走看看