题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
+2147483647
1a33
输出
2147483647
0
先介绍一下atoi函数:
用来把一个字符串转换成一个整数,例如:输入字符串“123”,输出数字123
思路:
此题最关键是要考虑到很多临界情况:
1、考虑是否是空字符串,空字符串不合法,返回0
2、考虑字符串是否合法,不合法,返回0
3、最大数问题,超过最大值,返回0
4、不合法情况下返回0,要与正常值返回0,作区分
5、只有正负号情况是合法的。
代码:
class Solution {
public:
int flag=true;//判断是正常返回的零,还是因为非法输入返回的零
int sys=0;//0代表是正数,1代表是负数
int StrToInt(string str) {
//语法: const char *c_str();
// c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同.
//如果不用此函数只能用下标法,不能用str直接str++,或者str--
const char* digit=str.c_str();
//考虑字符串是否为空,并做标记
int n=str.size();
if(n==0)
{
flag=false;
return 0;
}
long long num=0;
//考虑是否有正负号,并为负号做标记,并考虑只有正负号的输入,返回零(合法输入)
if(*digit=='+')
digit++;
else if(*digit=='-')
{ sys=1;
digit++;
}
//将字符串转化为数字,并检查中间是否有非法字符(不在0~9之间的字符)
while(*digit!='\0')
{
if(*digit>='0'&&*digit<='9')
{ int minus=(sys==-1)?-1:1;//判断是正值还是负值
num=num*10+minus*(*digit-'0');//由于需要判断大数问题,必须及时求出正负值
//判断大数问题(最大的正整数与最小的负整数)
if(num>0x7FFFFFFF||num<(signed int)0x80000000)
{
num=0;
break;
}
digit++;
}
else
{
flag=false;
return 0;
}
}
return num;
}
};