atoi实现,考虑溢出等各种情况

代码中有详细的注释,应该比较好理解。代码提交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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值