用c语言自己写一个简单的print函数

#include <stdio.h>

#define va_list void*
#define va_arg(arg, type)    *(type*)arg; arg = (char*)arg + sizeof(type);
#define va_start(arg, start) arg = (va_list)(((char*)&(start)) + sizeof(start))

void printNum(unsigned long num, int base)
{
    /* 递归结束条件 */
    if (num == 0)
    {
        return;
    }

    /* 继续递归 */
    printNum(num/base, base);

    /* 逆序打印结果 */
    putchar("0123456789abcdef"[num%base]);
}


void printFloat(double f)
{
    int temp;

    /* 先打印整数部分 */
    temp = (int)f;
    printNum(temp,10);

    /* 分隔点 */
    putchar('.');

    /* 打印小数部分 */
    f -= temp;
    if (f == 0)
    {
        /* 浮点型数据至少六位精度 */
        for (temp = 0; temp < 6; temp++)
        {
            putchar('0');
        }
        return;
    }
    else
    {
        temp = (int)(f*1000000);
        printNum(temp,10);
    }
}


void print( char* format,...)
{
 va_list arg;
    char ch;
    char *str;
    va_start( arg, format );
 while( ( ch = *format++ ) != '\0' )
 {

  if( ch != '%')
  {
   putchar( ch );
            continue;
  }

        switch( *format != '\0' ? *format++ : '\0' )
   {
    
     case 'd':
            printNum( *(int*)arg, 10);
               arg = (char *)arg + sizeof( format );                 
                        break;
     case 'f':
                        printFloat( *(double*)arg );
               arg = (char *)arg + sizeof( double );//为double型
                        break;
     case 'c':
            putchar( **(char**)arg );
               break;
     case 's':
            str = va_arg( arg, char*);
                        while( *str != '\0' )
                          putchar( *str++ );
                        break;
   }
       
 }
}


int main()
{
    print("%s\n","mcvfd");
 return 0;
}

猜你喜欢

转载自blog.csdn.net/sanpam/article/details/82562575
今日推荐