如果用long long来保存scan过程中的中间结果,代码如下:
class Solution
{
public:
int atoi(const char *str)
{
long long sum = 0;
int sign = 1;
const int len = strlen(str);
int idx = 0;
while(str[idx] == ' ') idx++; //略过前面的连续空格
if(str[idx] == '+')
{
sign = 1;
idx++;
}
else if(str[idx] == '-')
{
sign = -1;
idx++;
}
for(; idx<len; idx++)
{
int digit = str[idx]-'0';
if(digit >= 0 && digit <= 9)
sum = (sum*10 + digit);
else
break;
}
if(sum > INT_MAX) //处理溢出情况
return (sign==1)? INT_MAX: INT_MIN;
return sum*sign;
}
};
如果不允许用long long,则可以用一下方式处理溢出:
for(; idx<len; idx++)
{
int digit = str[idx]-'0';
if(digit >= 0 && digit <= 9)
{
if(sum > INT_MAX/10 || sum == INT_MAX/10 && digit > INT_MAX%10) //处理溢出情况
return (sign==1)? INT_MAX: INT_MIN;
sum = (sum*10 + digit);
}
else
break;
}
/*
if(sum > INT_MAX) //处理溢出情况
return (sign==1)? INT_MAX: INT_MIN;
*/
8.30最新代码:
class Solution {
public:
int atoi(const char *str) {
bool positive = true;
int value = 0;
int cur = 0;
while(str[cur] == ' ')
cur++;
if(str[cur] == '-')
{
positive = false;
cur++;
}
else if(str[cur] == '+')
{
positive = true;
cur++;
}
else if(str[cur] >= '0' && str[cur] <= '9')
{
positive = true;
}
else
return 0;
while(str[cur] >= '0' && str[cur] <= '9')
{
if(INT_MAX/10 < value || (INT_MAX/10==value && INT_MAX%10 < (str[cur]-'0')))
{
return positive?INT_MAX:INT_MIN;
}
value = value*10 + (str[cur]-'0');
cur++;
}
return positive?value:(0-value);
}
};