剑指 Offer 67. 把字符串转换成整数

剑指 Offer 67. 把字符串转换成整数

int my_atoi(char *str)
{
    //防止空指针
    assert(str);
    //开头若不为数字或正负号返回0
    if (isdigit(*str) && *str != '+' && *str != '-')
    {
        return 0;
    }
    //定义保存结果的变量
    long long result = 0;
    //定义符号标志
    int flag = 1;
    //丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
    while (isspace(*str))
    {
        *str++;
    }
    //当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,
    // 作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
    if (*str == '+')
    {
        flag = 1;
        str++;
    }
    else if (*str == '-')
    {
        flag = -1;
        str++;
    }
    //跳过连续的0(比如 -000000000000001 )
    while (*str == '0')
    {
        *str++;
    }
    //记录结果位数
    int count = 0;
    //依次扫描,直到字符串结尾结束并且位数小于11(INT_MAX为10位)如果超过10位,则没有必要继续向后
    while (*str != '\0' && count <11)
    {
        //如果不是数字类型字符,结束循环
        if (!isdigit(*str))
        {
            break;
        }
        //如果是为数字类型转字符,将其转换为数字
        result = result * 10 + (*str - '0');
        count++;
        str++;
    }
    //判断越界
    if (result > INT_MAX)
    {
        return INT_MAX;
    }
    if (result < INT_MIN)
    {
        return INT_MIN;
    }
    return flag*(int) result;
}

解析:

根据题意,有以下几种情况需要考虑:

  1. 首字符不为数字或正、负号:返回0即可;

  2. 开头空格字符:直接跳过;

  3. **符号位:**三种情况,即 ‘’+’’ , ‘’-’’ , ''无符号" ;新建一个变量保存符号位,返回前将结果乘符号位即可;

  4. 非数字字符:遇到其非数字字符直接返回当前已计算的结果;

  5. 数字字符:

    • 字符转数字: “此数字的 ASCII 码” 与‘0’ 的 ASCII 码” 相减即可;

    • 数字拼接: 若从左向右遍历数字,设当前位字符为*str,当前结果为 res,新结果为 newRes,则数字拼接公式为:

      newRes= res*10+ (*str - ‘0’)

  6. 数字越界处理

    定义保存结果变量时使用 long long 保存,最后让结果与INT_MAX或INT_MIN相比较,返回相应的越界值即可;

    if (result > INT_MAX)
        {
            return INT_MAX;
        }
    if (result < INT_MIN)
    {
        return INT_MIN;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值