代码中有详细的注释,应该比较好理解。代码提交leetcode,验证通过
int myAtoi(char* str)
{
if (str == NULL || *str == '\0')
return 0;
/* 跳过开始的空格*/
while (isspace(*str)) str++;
/* 第一个非空格字符,判断是否为‘+’或‘-’ */
int minus = 0;
if (*str == '-')
minus = 1;
if (*str == '-' || *str == '+')
str++;
/* k为unsigned int 是必须的,如果为int,minus=1时 k=|INT_MIN| (即INT_MAX+1) 会溢出 */
unsigned int k = (minus == 1 ? INT_MAX+1 : INT_MAX);
int n = k / 10;
int m = k % 10;
/* sum必须为unsigned int,否则不能处理最小负数的绝对值 */
unsigned int sum = 0;
while(*str <= '9' && *str >= '0' && *str != '\0') {
int c = *str - '0';
/* 如果当前的sum比n大,那么乘10后必然溢出,
如果等于n,但是读入的数大于最大数的个位数,也会溢出,
如果溢出,就返回最大的正数或最小的负数 */
if (sum > n || (sum == n && c > m)) {
if (minus)
return INT_MIN;
else
return INT_MAX;
}
sum = sum * 10 + c;
str++;
}
/* 将sum强制转换为int,返回 */
if (minus)
return (int)-sum;
return (int)sum;
}