【C语言进阶】实现atoi函数

1️⃣函数介绍:

atoi的函数功能:将string所指向数字字符串转化为整数

🍖注意:

1、会跳过前面的空白字符(例如空格,tab缩进)等。

2、如果不能转换成 int 或者为空字符串,那么将返回 0 。特别注意,该函数要求被转换的字符串是按十进制数理解的。

3、atoi输入的字符串对应数字存在大小限制(与int类型大小有关),若其过大可能报错-1

atoi对应头文件为<stdlib.h>

🍖实例应用:

(1)当字符串为空字符串
(2)当字符串带有正负号
(3)当字符串中含有空格
(4)当参数含有非数字字符
(5)当参数过大时

2️⃣函数实现思路:

针对上述实例应用输出结果,可以总结出以下几种情形:
1、参数为空指针
2、为空字符串
3、含有正负号
4、含有空格
5、含有非数字字符
6、溢出问题

基本思路:

3️⃣代码实现:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<ctype.h>
enum Status
{
    inlegal,
    legal
}status;
//定义一个枚举类型来判断是合法还是非法,区分空字符串返回0,还是合法返回0
int my_atoi(char* str)
{
    status = inlegal;
    long long ret = 0;
    int sign = 1;
    assert(str);///断言处理,判断是否为空指针
    if (*str == '\0')//判断是否是空字符串
    {
        return 0;//返回非法 0
    }
    while (*str == ' ')//当遇到空格时
    {
        str++;//跳至下一位
    }
    if (*str == '+')
    {
        sign = 1;
        str++;//跳至下一位
    }
    else if (*str == '-')
    {
        sign = -1;
        str++;//跳至下一位
    }
    while (*str)//'\0’之前
    {
        if ((isdigit(*str)))//disigit-->判断是否为数字字符函数
        {
            ret = ret * 10 + sign * (*str-'0');
            //数字字符转化为数字
        }
        if (ret > INT_MAX)//如果ret为int型,则一定小于INT_MAX
        {
            return INT_MAX;
        }
        else if (ret < INT_MIN)
        {
            return INT_MIN;
        }
        if (!(isdigit(*str)))
        {
            return ret;
        }
        str++;
    }
    //跳出while循环,遇到'\0'
    status = legal;
    return ret;
}
int main()
{
    char arr[] = "-12839#9210";
    int ret = my_atoi(arr);
    if (status == inlegal)
    {
        printf("是非法数字字符串,%d\n", ret);
    }
    else if (status == legal)
    {
        printf("是合法数字字符串,%d\n", ret);
    }
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伱恏呀呀呀呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值