You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串转整数myAtoi函数处理超大负数时出现Long Long溢出问题求助

解决myAtoi实现中的Long Long溢出与逻辑问题

原代码存在的核心问题

  • 符号位处理逻辑漏洞:符号位只能出现在数字前的空白之后且仅能出现一次,原代码允许符号位在任意位置出现,甚至数字之后,会错误标记负数
  • 无溢出检查:输入数值超出int范围或接近long long边界时,未做截断处理,导致结果错误
  • 字符判断可读性差:使用ASCII码值(48、45)代替字符常量('0'、'-'),代码维护性差
  • 输出与返回类型不匹配:用%d打印long long类型变量,返回值为int却直接返回long long,会引发类型截断错误

修正后的代码

#include <stdio.h>
#include <limits.h> // 引入INT_MAX和INT_MIN的定义

int myAtoi(char *s)
{
    int i = 0;
    int isNegative = 0;
    long long res = 0;

    // 跳过开头所有空白字符
    while (s[i] == ' ') {
        i++;
    }

    // 仅处理一次符号位
    if (s[i] == '-' || s[i] == '+') {
        isNegative = (s[i] == '-') ? 1 : 0;
        i++;
    }

    // 处理数字并提前检查溢出
    while (s[i] >= '0' && s[i] <= '9') {
        // 预判res*10 + digit是否会超出INT_MAX
        if (res > (INT_MAX - (s[i] - '0')) / 10) {
            return isNegative ? INT_MIN : INT_MAX;
        }
        res = res * 10 + (s[i] - '0');
        i++;
    }

    // 应用符号并最终校验边界
    if (isNegative) {
        res = -res;
        if (res < INT_MIN) return INT_MIN;
    } else if (res > INT_MAX) {
        return INT_MAX;
    }

    printf("%lld\n", res); // 使用%lld匹配long long类型
    return (int)res;
}

int main()
{
    char a[] = "-91283472332";
    myAtoi(a);
    return 0;
}

关键修正点说明

  • 空白字符单独处理:用独立循环跳过开头所有空白,逻辑更清晰
  • 符号位合法性校验:仅在空白后处理一次符号位,避免非法位置的符号干扰
  • 提前溢出检查:通过res > (INT_MAX - digit)/10预判溢出,避免实际计算时触发溢出错误
  • 可读性优化:用字符常量替代ASCII码值,代码更直观
  • 类型匹配修正:用%lld打印long long变量,返回时强制转为int,符合函数定义

输入"-91283472332"时,该值小于INT_MIN(-2147483648),修正后的代码会直接返回INT_MIN,符合LeetCode题目要求。

内容的提问来源于stack exchange,提问作者DHRUV KABRA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:30:50