题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
+2147483647 1a33
输出
2147483647 0
分析:这道题本身不难,不过需要注意的是考虑完整各种非法输入问题,比如空字符串,字符不在‘0’~‘9’之间,字符串转成的整数超过int能表示的范围,只有一个‘+’或者‘-’的时候,还有就是非法输入的时候返回0,那输入0的时候是合法的,返回也是0,要用全局变量解决这个事情。
代码:
class Solution {
public:
enum Status {kValid=0,kInvalid};
int g_nStatus=kValid;
int StrToInt(string str) {
long long res=0;
int start=0;
bool minus=false;
g_nStatus=kInvalid;
if(str.length()==0)
return 0;
if(str[0]=='-'){
minus=true;
start++;
}
else if(str[0]=='+')
start++;
if(str[start]!='\0')
res=str2int(str,start,minus);
return (int)res;
}
long long str2int(string str,int start,bool minus){
long long num=0;
while(str[start]!='\0'){
if(str[start]>='0'&&str[start]<='9'){
int flag=minus?-1:1;
num=num*10+flag*(str[start]-'0');
if((!minus&&num>0x7FFFFFFF)||(minus&&num<(signed int)0x80000000)){
num=0;
break;
}
start++;
}
else{
num=0;
break;
}
}
if(str[start]=='\0')
g_nStatus=kValid;
return num;
}
};
public:
enum Status {kValid=0,kInvalid};
int g_nStatus=kValid;
int StrToInt(string str) {
long long res=0;
int start=0;
bool minus=false;
g_nStatus=kInvalid;
if(str.length()==0)
return 0;
if(str[0]=='-'){
minus=true;
start++;
}
else if(str[0]=='+')
start++;
if(str[start]!='\0')
res=str2int(str,start,minus);
return (int)res;
}
long long str2int(string str,int start,bool minus){
long long num=0;
while(str[start]!='\0'){
if(str[start]>='0'&&str[start]<='9'){
int flag=minus?-1:1;
num=num*10+flag*(str[start]-'0');
if((!minus&&num>0x7FFFFFFF)||(minus&&num<(signed int)0x80000000)){
num=0;
break;
}
start++;
}
else{
num=0;
break;
}
}
if(str[start]=='\0')
g_nStatus=kValid;
return num;
}
};