把字符串转换成整数(atoi)(C++)

本文介绍了如何编写一个函数StrToInt,将包含符号、空格和数字的字符串转换为整数,遵循特定的转换规则。在转换过程中,需要处理正负号、整数的有效部分、可能的整数溢出以及无效字符。示例展示了不同输入情况下函数的正确返回值。

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

把字符串转换成整数(atoi)

描述

  写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:

  1. 若干空格
  2. (可选)一个符号字符(‘+’ 或 ‘-’)
  3. 数字,字母,符号,空格组成的字符串表达式
  4. 若干空格

转换算法如下:
1.去掉无用的前导空格
2.第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
3.判断整数的有效部分:
  3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
  3.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
  3.3 整数超过 32 位有符号整数范围 [−231, 2****31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231的整数应该被调整为 −2****31 ,大于 2****31 − 1 的整数应该被调整为 2****31 − 1
4.去掉无用的后导空格

数据范围:

  1. 0 <=字符串长度<= 100
  2. 字符串由英文字母(大写和小写)、数字(0-9)、’ ‘、’+‘、’-’ 和 ‘.’ 组成

实例1

输入:
"82"
返回值:
82

实例2

输入:
"   -12  "
返回值:
-12
说明:
去掉前后的空格,为-12  

实例3

输入:
"4396 clearlove"
返回值:
4396
说明:
6后面的字符不属于有效的整数部分,去除,但是返回前面提取的有效部分  

实例4

输入:
"clearlove 4396"
返回值:
0

实例5

输入:
"-987654321111"
返回值:
-2147483648

思路/解法

根据不同情况下逐一判断即可。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    int StrToInt(string s) {
        int res = 0;
        int isFu = 0;
        bool flag = false;
        for(int i = 0;i < s.length();i++)
        {
            //判断为正数还是负数
            if((s[i] == '-' || s[i] == '+') && isFu != 0)
                break;
            else if(s[i] == '-' && !flag)//正负数之前不能有数字否则直接break
                isFu = 1;
            else if(s[i] == '+' && !flag)//正负数之前不能有数字否则直接break
                isFu = 2;
            //数据则累加
            else if(s[i] >= 48 && s[i] <= 57)
            {
                //方式一
                res = res*10 + (s[i] - 48);
                //考虑int类型越界问题
                if(res < 0)
                {
                    res = INT_MAX;
                    if(isFu == 1)
                        return (res+1)*(-1);
                    return res;
                }
                flag = true;
                //方式二
                //int temp = isFu == 1?res*(-1):res;
                //考虑int类型越界问题
                //if (temp > INT_MAX / 10 || (temp == INT_MAX / 10 && s[i] - 48 > INT_MAX % 10)) return INT_MAX;
                //if (temp < INT_MIN / 10 || (temp == INT_MIN / 10 && s[i] - 48 < INT_MIN % 10)) return INT_MIN;
                //res = res * 10 + (s[i] - 48);
                //flag = true;
            }
            else if(flag || s[i] != ' ')//除此之外,已经有数据累加至res且出现其他字符则直接break或者如“q12”这类情况则直接去除
                break;
        }
        if(isFu == 1)
            return (-1)*(res);
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ufgnix0802

总结不易,谢谢大家的支持

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

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

打赏作者

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

抵扣说明:

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

余额充值