题目描述:
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例:
输入:
+2147483647
1a33
输出:
2147483647
0
首先,写代码之前先考虑所有可能的测试用例的习惯,在这个题上,我分析有以下几种输入:
- 空指针,即传入的指针 str==NULL;
- 指针为空,即传入的字符串为空字符串,str="";
- 数字,123456
- +、-,出现在第一位时代表数字的正负,后面出现视为非法输入
- 字母等其他非法输入
其次,需要考虑范围的问题,正整数的最大值为0x7FFFFFFF,最小的负数是0x80000000,分两种情况判断整数是否发生上溢出或者下溢出。
下面是实现代码:
class Solution {
public:
int StrToInt(string str) {
//1.空指针 str==NULL
//2.指针为空 str="";
//3.非法输入 符号、字母、两个符号+-
//4.直接为数字,没有符号
int len=str.length();
if(len==0)
return 0;
int i=0;
int num = 0;
int flag = true;
while(str[i]==' ')
{
i++;
}
//判断第一个字符的类型
if (str[i] == '+') //第一位为+
{
i++;
}
else if (str[i] == '-') //第一位为-
{
i++;
flag *= false;
}
while(str[i] != '\0') //如果没有到字符串结尾
{
if (str[i] >= '0' && str[i] <= '9')
{
int tmp = flag ? 1 : -1;
num = num * 10 + tmp*(str[i] - '0');
//整数超出范围
if ((!flag && num > 0x7FFFFFFF) || (flag && num < (signed int)0x80000000))
{
num = 0;
break;
}
i++;
}
else
{
num = 0;
break;
}
}
return num;
}
};