通过一个atoi函数能学到多少知识?

本文详细解析了atoi函数的实现过程,从基本的字符到整数转换到处理各种边界情况,如空字符串、负数、非数字字符及溢出判断。通过实现一个改进版的atoi函数,读者将了解到枚举类型、全局变量的使用以及如何确保函数的健壮性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是atoi函数,就是把字符串转成数字,比如你输入“123”,系统就会输出123(整形),这就是atoi函数,这么一个看似简单的函数,实际写起来能学到多少知识呢?

我们慢慢看。

 

如何实现这个函数?

最简单的方式有人一下就能想到:

int My_atoi(char *str)
{
    if(str == NULL)
    {
	    return 0;
    }
    int num = 0;
    while(*str! = ‘\0’)
    {
        num = num*10 + (str-“0”);
        str++;
    }
    return num;
}

这看似完成了atoi函数的实现,实际上太多的问题没有考虑进去:

  1. 输入的空字符串和字符“0”输出的结果一样,没法判断是字符“0”还是空字符串
  2. 输入负数时,前面的“-”没法判断
  3. 通过上面这个问题,如果只输入“+”或者“-”,又改怎么样?
  4. 输入其他字符如“#%&*……”等字符没有进行判断
  5. 如果超出整形数字的范围,该怎么判断?

 

把这么都考虑上,我们能学到那些东西呢?

针对第一点:系统的atoi函数是通过一个全局变量进行空字符串和字符“0”的判断,输入空字符串全局变量会改变,而字符“0”不会改变。

这里又引入了一个枚举类型的关键字:enum

enum是一种枚举数据类型,目的是解决一些无法用当前数据类型无法描述的数据类型,比如一周有七天,一年有十二个月就可以用枚举类型enum来实现:enum 枚举名{枚举值表}

举例:enum week{sun,mon,tue,wed,thu,fri,sat};

 

这个枚举类型可以帮我们设置全局变量,使得更改全局变量的值。

 

在我们考虑了以上问题时,我们接下来就完成代码吧:

enum Stat(kivd = 0,kivd1);//枚举类型
int q_Stata = kivd;//全局变量

int My_atoi(char *str)
{
	q_Stata = kivd1;
	int num = 0;
    if(*str != NULL || *str!= ‘\0’)
    {
	    bool Ta = true;//正数为真,负数为false
	    if(*str == ‘+’)
        {
	        str++;
        }
        else if(*str == ‘-’)
        {
	        Ta = false;
	        str++;
        }

        if(*str != ‘\0’)//如果正负号之后还有字符,则进入转换字符
        {
	        num = Atoi_Main(str,Ta);
        }
    }
    return num;
}

以上是判断函数,以及安全处理 

 

int Atoi_Main(char *dig , bool Tb)
{
	int num;
	while(*str!=’\0’)
    {
	    if(*str>= ‘0’ && *str<=’9’)
        {
	        int flat = Tb?1:-1;//判断正负
	        num = num * 10 + (flat*(*dig –‘0’));//进行转换
	        if(Tb && num > 0x7FFFFFFF 
            || (!Tb && num < (signed int)0x80000000))
            //判断如果是正数并且超出整形最大范围,负数是否超出最大范围
            {
	            num = 0;
	            break;
            }
        }
        else
        {
	        num = 0;
	        break;
        }
    }
    if(*str == ‘\0’)//如果遍历完成到了最后的结束字符,说话字符串没问题
    {
	    q_Stata = kivd;
    }
    return num;
}

 

一个看似简单的atoi函数,你能学到多少知识?

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值