剑指Offer(第2版)——面试题67:把字符串转换成整数

本文深入探讨了如何不使用库函数将字符串转换为整数的算法实现,详细讲解了处理空指针、正负号、非法字符及溢出等问题的解决方案。

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

题目

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。

解题思路

这道题需要对输入的不同情况考虑全面:

  • 指针是否为空指针,字符串是否为空字符串;
  • 字符串对于正负号的处理;
  • 输入值是否为合法值,即小于等于’9’,大于等于’0’;
  • int为32位,需要判断是否溢出;
  • 使用错误标志,区分返回值为0时是合法值0输入还是非法值输入。
代码
class Solution{
public:
    //全局变量
    //enum枚举类型是C/C++中的一种数据类型,与struct和class一样是用户自定义的类型。
    enum Status{kValid, kInValid};//枚举元素(kValid=0,kInvalid=1)
    int g_nStatus = kValid; //标记是否为非法输入

    int StrToInt(string str){
        g_nStatus = kInValid; //初始标记为非法输入
        long long num = 0; //64位,存储结果
        const char *cstr = str.c_str(); //c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同。
        
        //判断是否为空指针和是否为空字符串
        if(cstr != nullptr && *cstr != '\0'){
            //处理符号位
            int minus = 1; //正负号标志位,默认是加号
            if(*cstr == '+') cstr++;
            else if(*cstr == '-'){
                minus = -1;
                cstr++;
            }

            //处理其余位
            if(*cstr != '\0') num = StrToIntCore(cstr, minus);
        }
        return (int)num;
    }
private:
    long long StrToIntCore(const char *cstr, int minus){
        long long num = 0;
        while(*cstr != '\0'){
            //判断是否是合法值
            if(*cstr >= '0' && *cstr <= '9'){
                // string转int类型
                num = num * 10 + minus * (*cstr - '0');

                //判断是否溢出
                if(((minus > 0) && num > 0x7fffffff) || ((minus < 0) && num < (signed int)0x80000000)){
                    num = 0;
                    break;
                }
                cstr++;
            }
            else{
                num = 0;
                break;
            }
        }
        //判断是否正常结束(全循环完毕),区分num=0是合法值0输还是非法值输入
        if(*cstr == '\0') g_nStatus = kValid;
        return num;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值