注意两个问题:
1.空格、\t、\n等符号、正负号以及它们出现的位置;
如:
不规则输入,但是有效,”-3924x8fc”,” +1" (第一个有效字符是正负号或者是数字或者空格,不是则视为无效,到第一个非数字的字符之前为止)
无效格式,” ++c”, ” ++1”,+ 413”,“abc”(
正负号之后必须是数字,否则无效)
2.是否越界,
若越界取最大值或最小值。
溢出数据,”2147483648”(
INT_MAX (2147483647) or INT_MIN (-2147483648)
)
//
// start: reverse string to integer
int atoi(const char* str)
{
int result = 0;
int sign = 1;
const int len = strlen(str); // 不能用sizeof
int i = 0;
while(str[i] == ' ' && i < len)
i++;
if(str[i] == '+')
i++;
if(str[i] == '-')
{
i++;
sign= -1;
}
for(; i < len; i++)
{
if(str[i] < '0' && str[i] > '9')
break;
if(result >= INT_MAX/10 && str[i] >= '0' && str[i] <= '9') // 判断是否越界: 当前的result比max/10大且当前的字符仍是数学需要乘以10
{
if(sign == 1)
result = INT_MAX;
if(sign == -1)
result = INT_MIN;
break;
}
result = result*10 + str[i] - '0';
}
return result;
}
// end
//