字符串转整数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
相关产品推荐
相关产品推荐

