【c语言】实现printf函数

题外话:我这次又来再一次吃c语言的螃蟹,好好反思吧,为什么总是我在吃螃蟹。用本人的话说,从此自主可控这句话就是真的,而不是梦。

#include <stdio.h>
#include <stdarg.h>
#include <inttypes.h>
#include <math.h>
#ifdef _WIN32//操作系统判断
int isL=0x37;
#else
int isL=0x57;
#endif
int myPrintf(const char *frm, ...) {
  int cnt = 0, y, z;va_list arg;va_start(arg, frm);//开始遍历
  for (int i = 0;frm[i]; ++i)
    switch (frm[i]) {
      case '%': switch (frm[++i]) {
          case '%': putchar(frm[i]);++cnt;break;
          case 'o': { unsigned int t=va_arg(arg,unsigned int);y=0;
              char s[11];
              do{ 
                s[y++]=t%8+48;t/=8;++cnt;
              }while(t);
              while(y)putchar(s[--y]);
			  		} break;
          case 'x': { unsigned int t=va_arg(arg,unsigned int);y=0;
              char s[11];
              do{
                z=t%16;s[y++]=z>9?z+0x57:z+48;t/=16;++cnt;
              }while(t);//解决十六进制
              while(y)putchar(s[--y]);
              } break;
          case 'p': { unsigned long t=va_arg(arg,unsigned long);y=0;putchar('0');
              if(isL==0x57)putchar('x');//系统特定打印判断
              char s[11];
              do{
                z=t%16;s[y++]=z>9?z+isL:z+48;t/=16;++cnt;
              }while(t);if(y<7)s[y++]=48;
              while(y)putchar(s[--y]);
             } break;
          case 'c': { int t=va_arg(arg,int);putchar(t>128||t<-1?63:t); } break;
          case 'd':{
            int t = va_arg(arg,int);y=0;if(t<0)putchar('-'),++cnt;
            char s[11];
            do{ 
              s[y++]=t>0?t%10+48:-(t%10)+48;t/=10;++cnt;
            }while(t);
            while(y)putchar(s[--y]);
          } break;
          case 's':{
            const char*str=va_arg(arg,const char*);
            for (int i = 0;str[i]; i++){
              putchar(str[i]),++cnt;
            }
          } break;
          case 'l': switch (frm[++i]){
            case 'l':if(frm[++i]=='d'){
              long long t = va_arg(arg,long long);y=0;if(t<0)putchar('-'),++cnt;
              char s[19];
              do{ 
                s[y++]=t>0?t%10+48:-(t%10)+48;t/=10;++cnt;
              }while(t);//处理正负数字
              while(y)putchar(s[--y]);
             }else continue;break;
             case 'd':{
              long t = va_arg(arg,long);y=0;if(t<0)putchar('-'),++cnt;
              char s[11];
              do{ 
                s[y++]=t>0?t%10+48:-(t%10)+48;t/=10;++cnt;
              }while(t);
              while(y)putchar(s[--y]);
             } break;
             case 'f':{
              double l=va_arg(arg,double);long long t=(long long)l;l-=t;
              y=z=0;if(t<0)putchar('-'),l=-l,++cnt;
              char s[26];
              do{ 
                s[y++]=t>0?t%10+48:-(t%10)+48;t/=10;++cnt;
              }while(t);
              while(y)putchar(s[--y]);s[y++]=0x2e;t=10;
              do{
                s[y++]=(int)((l+1e-6)*t)%10+48;t*=10;l-=(int)l;++cnt;
              }while(t<1000001);
              while (y>z)putchar(s[z++]);
             } break;
          } break;
        } break;
      default:putchar(frm[i]),++cnt;break;
    }va_end(arg);
  return cnt;
}
int main() { 
  myPrintf("INT32_MAX = %d\n",INT32_MAX);
  myPrintf("INT32_MIN = %d\n",INT32_MIN);
  myPrintf("INT32_MAX = %x\n",INT32_MAX);
  myPrintf("char = %c\n",-1);
  myPrintf("char = %lf\n",-801.235324);
  myPrintf("INT64_MAX = %lld\n",INT64_MAX);
  myPrintf("INT64_MIN = %lld\n",INT64_MIN);
  return 0;
}//老铁请双击留言+关注,或者三连,点赞收藏加关注,:)

输出

INT32_MAX = 2147483647
INT32_MIN = -2147483648
INT32_MAX = 7fffffff
char =char = -801.235324
INT64_MAX = 9223372036854775807
INT64_MIN = -9223372036854775808
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值