题目:把字符串转换成整数
思路:
如果对于一般规则的数字“字符串”转化为数字都很容易,比如:
对于“123456”可以利用如下代码进行转化:
string str="123456";
int ans = 0;
for (int i=0; i<str.size(); ++i)
{
ans = ans * 10 + (str[i] - '0');
}
问: str[i]-'0'是什么意思?
问:ans = ans * 10 + (str[i] - '0')是什么意思?
int的范围为 ![[-2^{31},2^{31-1}]](https://file.cfanz.cn/uploads/gif/2023/05/02/4/606X447f80.gif)
如果超过了这两个范围该怎么办?
其实也很简单,首先判断这个数的正负,如果正数,超过了INT_MAX,就设置为INT_MAX,如果是负数,首先我们不考虑负号,如果超过了INT_MAX+1, 则就置为INT_MAX+1, 最后再根据正负号,来加负号。
//判断正负
bool neg = str[i]=='-' ? true : false;
//判断该下标对应的字符是否是数字
//如果是,就i=i
//如果否,就i=i+1,往后挪一位
i = isdigit(str[i]) ? i : i+1;
long long ans = 0L; // 因为INT_MAX+1超过了int的范围
while (i < len && isdigit(str[i])) {
ans = ans * 10 + (str[i++]-'0');
if (!neg && ans > INT_MAX) {
ans = INT_MAX;
break; //因为此处以为最大值,所以直接break
}
if (neg && ans > 1L + INT_MAX) {
ans = 1L + INT_MAX;
break;
}
}
long long ans = 0L;是什么意思?
最后再考虑一些特殊情况即可。
class Solution
{
public:
int StrToInt(string str)
{
const int len = str.length();
if (len == 0) return 0;
int i = 0;
while (i < len && str[i] == ' ') { ++i; } // 排除开头的空格
if (i == len) return 0;
if (!isdigit(str[i]) && str[i] != '+' && str[i] != '-') return 0;
bool neg = str[i] == '-' ? true : false;
i = isdigit(str[i]) ? i : i + 1;
long long ans = 0L;
while (i < len && isdigit(str[i]))
{
ans = ans * 10 + (str[i++] - '0');
if (!neg && ans > INT_MAX)
{
ans = INT_MAX;
break;
}
if (neg && ans > 1L + INT_MAX) {
ans = 1L + INT_MAX;
break;
}
}
if (i != len) return 0; // 不要此处,就是atoi()库函数的实现
return !neg ? static_cast<int>(ans) : static_cast<int>(-ans);
}
};
这段代码实现了将字符串转换成整数的功能,其流程如下:
- 首先判断输入字符串是否为空串,如果是,则直接返回0;
- 接着排除开头的空格符;
- 如果剩余字符中不是数字字符也不是正号或负号,则认为输入不合法,返回0;
- 确定正负性,如果是负数,则标记neg为true;
- 从第一位开始,取出连续的整数子串,并将其转换成整数。如果超过int类型能表示的范围,进行相应处理;
- 最后根据正负标志返回对应整数。
这段代码完善地考虑了各种异常情况,比如前导空格、加减号位置、多余字符等,使用了long long类型来避免数据溢出等问题。同时,代码结构清晰,变量名具有描述性,易于理解和调试。