class Solution {
public:
int atoi(const char *str) {
int idx = 0, sign = 1, val = 0;
if(strlen(str) == 0) return 0;
while(str[idx] == ' ') ++idx;
if(str[idx] == '-') {sign = -1; ++idx;}
if(str[idx] == '+') {++idx;}
for(; idx < strlen(str); ++idx){
if(str[idx] > '9') break;
// 越界处理, 保证下一步val*10 + str[idx] - '0' 不能大于最大值
// 但是判断是时要分开判断,val*10 和 str[idx] - '0' 把数字尽量变小,防止越界
// val 大于 最大整数/10 越界,不能 val * 10 大于 最大整数, val * 10 会越界。
// 当 val 等于 最大值/10 时 判断剩下的str[idx] - '0' 是否大于 最大值%10,防止相加后会越界
if(val > INT32_MAX / 10 || (val== INT32_MAX/10 && INT32_MAX % 10 < str[idx] - '0')){
return sign == 1 ? INT32_MAX : INT32_MIN;
}
val = val * 10 + str[idx] - '0';
}
return val * sign;
}
};