简单的printf函数实现

来源:互联网 发布:js函数式编程是什么 编辑:程序博客网 时间:2024/06/02 21:26

源码如下:

       #include<stdio.h>
#include<stdarg.h>
#include "myprintf.h"
long int mypow(int a,int n)
{
 long int result=1;
 int i=0;
 for(;i<n;i++)
  result=result*a;
  return result;
}
int float2str(char *s,float a,int len1,int len2)//float 转换成字符串
{
 int b;
int i,d,j=0;
 b=(int)a;
if(b<0)//判断正负
{
 s[0]='-';
 j=1;
 b=-b;
 
}
for(i=j;i<len1+j;i++)
s[i]='0'+(b/(int)mypow(10,len1+j-i-1))%10;
s[len1+j]='.';
d=(int)((-a-b)*(int)mypow(10,len2));
for(i=0;i<len2;i++)
s[i+len1+j+1]='0'+(d/(int)mypow(10,len2-i-1))%10;
s[len1+len2+1+j]='/0';
return len1+len2+1+j;
}

char *itoa(int value, char *string, int radix)//整数转换成字符串
{
int     i, d;
int     flag = 0;
char *ptr = string;
if (radix != 10)
{
       *ptr = 0;
       return string;
}
if (!value)
{
       *ptr++ = 0x30;
       *ptr = 0;
       return string;
}

if (value < 0)
{
       *ptr++ = '-';
       value *= -1;
}
for (i = 10000; i > 0; i /= 10)
{
       d = value / i;
       if (d || flag)
       {
         *ptr++ = (char)(d + 0x30);
         value -= (d * i);
         flag = 1;
       }
}

*ptr = 0;
return string;
}
int IntoBHex(int a,char *str,int radix)//整数转换成16进制或2进制
{
 
 int i=0,j=0,temp=a;
 unsigned  char mask=0;
 
 if(2==radix)
 {
  if(0==temp)
  {
   str[0]='0';
   str[1]='/0';
   return 2;
  }
  for(;i<sizeof(int)*8;i++)
  {
   if(temp&(0x80000000>>i))
    str[i]='1';
   else
    str[i]='0';
  }
  str[i]='/0';
  return i;
 }
 if(16==radix)
 {
  str[0]='0';
  str[1]='x';
  for(i=sizeof(int)*2-1;i>=0;i--,j++)
  {
   mask=(temp)>>(i*4);
   mask=mask&0x0f;
   
   if (mask<=9) {
    str[j+2]='0'+mask;
   }
   else
   {
    str[j+2]='A'+mask-10;
   }
   
   
   
  }
  str[j+2]='/0';
  return j+2;
 }
}
void myprintf(const char *fmt, ...)
{
const char *s;
int d,i;
 int x,len;
 
float f;
char buf[35],flag=1;/*flag用于判断'0'是否要输出*/
va_list ap;
va_start(ap, fmt);
while (*fmt) {
       if (*fmt != '%')
       {
         putchar(*fmt++);
         continue;
       }
       switch (*++fmt) {
         case 's':
            s = va_arg(ap, const char *);
            for ( ; *s; s++) {
                   printfchar(*s);
            }
            break;
         case 'd':
         case 'D':

            d = va_arg(ap, int);
            itoa(d, buf, 10);
            for (s = buf; *s; s++) {
                   printfchar(*s);
            }
            break;
         case 'x':
         case 'X':
            x = va_arg(ap, int);
            len=IntoBHex(x, buf, 16);
   flag=1;
            for (i=0; i<len;i++) {
    
     if(buf[i]!='0'||flag)
     {
                   printfchar(buf[i]);
         flag=1;
     }
            }
            break;
   case 'b':
   case 'B': 
    x = va_arg(ap, int);
    len=IntoBHex(x, buf, 2);
    flag=0;
    for (i=0; i<len;i++) {
       if(8==len-i)
        flag=1;
      if(buf[i]!='0'||flag)
      {
     printfchar(buf[i]);
     flag=1;
      }
    }
    break;
         case 'f':
   case 'F': 
    f = va_arg(ap, double);
    len=float2str(buf,f, 10, 6);
      flag=0;
    for (i=0; i<len;i++) {
     if(buf[i]!='0'||flag)
     {
       printfchar(buf[i]);
       if(buf[i]!='-')
         flag=1;
     }
    }
    flag=1;
    break;
    case 'c':
   case 'C': 
   x = va_arg(ap,int);
     putchar(x);
    break;
         default: 
            printfchar(*fmt);
            break;
       }
       fmt++;
}
va_end(ap);
return ;
}
int main()
{
  char *s="hello,world";
  int a=1000,b=-100;
  char c='b';
  double f=-22.5;
  myprintf("f=%f/na=%b/nb=%x/n c=%c b=%d",f,a,b,c,b);
  return 1;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击