面试被要求实现这个函数。
函数功能:将字符串转换为整数。那么实现这个一半需要考虑到哪些情况呢?
- 符号:整数可以为负数。
- 考虑上溢和下溢
- 字符中的非法字符如何处理
我们知道int类型计算机存储中占32bit, 首位存储符号,表示的数范围为-2147483648 - 2147483647
#define MAX_INT ((1 << 31) - 1)
#define MIN_INT (-(1 << 31))
using namespace std;
int MyAtoi(char *str)
{
char *temp = str;
int i = 0;
int flag = 0;
unsigned int sum = 0;
while( ' ' == *temp ) ++temp; //排除开头的空格
if( *temp != '-' && *temp != '+' && (*temp < '0' || *temp >= '9') ) { //第一个字符不是数字或者+-号
return -1;
}
if( *temp == '-' ) { //第一个是负号
flag = 1;
++temp;
}
else if( *temp == '+' ) {
++temp;
}
while( *temp >= '0' && *temp <= '9' ) {
if( !flag ) { //上溢
if(sum > MAX_INT/10 || (sum == MAX_INT/10 && (*temp > '7'))) {
return MAX_INT;
}
}
else { //下溢
if(sum > MAX_INT/10 || (sum == MAX_INT/10 && (*temp > '8')))
{
return MIN_INT;
}
}
sum = sum * 10 + (*temp - '0');
++temp;
}
return flag ? (-1*sum):sum;
}