题目:
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
思路:
需要设置一个异常变量,当异常发生时,该变量为true,返回0;(字符串为空时为无效输入)
先判断第一位是不是符号位,并判断下一位是否还有数字(如果没有数字,则抛出异常,输出0)
再判断字符串中是否有不是数字的字符(如果有,设置异常,输出0)
判断数字是否溢出
当转换到字符串末尾时,说明转换完成,没有异常,设置异常变量为false,输出转换之后的数值
代码实现:
class Solution {
public:
bool Invalid = false; // enum Status {kValid = 0; kInvalid}; int n_status = kValid;
int StrToInt(string str) {
Invalid = true;
int len = str.length();
long long result = 0;
if(len > 0) // 排除空字符串
{
bool minus = false;
int idx = 0;
if(str[idx] == '+')
idx++;
else if(str[idx] == '-')
{
minus = true;
idx++;
}
if(str[idx] != '\0')
result = StrToIntCore(str, idx, minus); // 需要带上符号位,因为需要判断是否溢出
}
return (int)result;
}
int StrToIntCore(string str, int idx, bool minus)
{
long long num = 0;
while(str[idx] != '\0')
{
if(str[idx] >= '0' && str[idx] <= '9')
{
int flag = minus ? -1 : 1;
num = num * 10 + flag * (str[idx] - '0');
/*---判断是否溢出---*/
if((minus && num < (signed int)0x80000000) || (!minus && num > 0x7FFFFFFF))
{
num = 0;
break;
}
idx++;
}
else
{
num = 0;
break;
}
}
/*---当转换到字符串结尾时,即未发生异常,将异常变量设置为false---*/
if(str[idx] == '\0')
Invalid = false;
return num;
}
};