简版的printf函数的实现

能实现输入数字 输入字符 数字包括(100末尾有0的数字 INT32_MAX INT32_MIN 负数)

实现代码如下:

#include <stdio.h>
#include <stdarg.h>
#include <inttypes.h>
#include<string.h>
int rev_num(int x1 ,int * temp)
{
    *temp=0;
    int dight=0;
    while(x1){
        *temp=*temp*10 +x1%10;
        x1/=10;
        dight++;
    }
    return dight;
}
int output_num(int dight ,int temp)
{
    int cnt=0;
    while (dight--)
    {
        putchar(temp%10+'0'),cnt++;
        temp/=10;
    }
    return cnt;
}
int my_print(const char* frm,...)
{
    int cnt=0;
    va_list arg;
    va_start(arg,frm);
    #define putc(a) putchar(a) ,cnt++
    for(int i=0; frm[i] ; i++ )
    {
        switch(frm[i])
        {
            case '%':{
                switch (frm[++i])
                {

                    case 'd':{
                    int  xx=va_arg(arg,int);
                    uint32_t x;
                    if(xx<0)  putc('-') , x=-xx;
                    else x=xx;
                    int temp1,temp2;
                    
                    int x1 ,x2;
                    x1=x/100000,x2=x%100000;

                    int dight1=rev_num(x1,&temp1);
                    int dight2=rev_num(x2,&temp2);

                    cnt+=output_num(dight1,temp1);
                    cnt+=output_num(dight2,temp2);
                    }break;

                     case 's':{
                    
                    const char* str =va_arg(arg,const char *);
                    for(int j=0;str[j];j++)
                    {
                        putc(str[j]);
                    }

                    }break;
                }
                
            }break;

            default : putc(frm[i]); break;
        }
    }
    #undef putc
    va_end(arg);
    return cnt;
}
int main()
{       
    my_print("hello world\n");
    my_print("a : %d\n", 123);
    my_print("a : %d\n",1000);
    my_print("a : %d\n",INT32_MAX);
    my_print("a : %d\n",INT32_MIN);
    my_print("a : %d\n",INT32_MAX);
    my_print("a : %s\n","nihaoniubi");
    
    return 0;
}

运行结果:
在这里插入图片描述
注意

  • rev_num传入参数temp时,若想在此函数中改变temp的值,需要传入temp的地址,否则传入变量只是一个变量只仅限于函数中,函数结束后,值是不变的
  • 在for循环的第二个条件,frm[i];计算机中’\0’表示为0,所以字符数组遍历结束后,遇到’\0’便结束循环
  • 注意case 的写法,他的规范
  • 在计算机中负数用补码表示 01111111是正数最大 他的补码是10000001,但是负数最小是10000000,所以导致int无法存下 -INT32_MIN,用usigned int ,uint32_t就是无符号整形

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值