编写不依赖C标准库函数的字符串转整数程序遇阻求助
修复字符串转整数的实现问题
你的代码存在几个关键错误,导致无法正常完成字符串转整数的功能,以下是问题点和修复方案:
核心错误点
- 正负号处理后直接返回符号值:原代码在识别到
+或-后,设置完sign就直接return sign,这会导致程序只返回±1,完全跳过了后续数字的转换逻辑,这是最致命的问题。 - 循环结束后错误返回0:遍历完所有数字字符后,你返回的是0而不是计算好的
num * sign,等于白做了数字累加。 - 遇到非数字直接返回0:常规的字符串转整数逻辑是遇到非数字字符就停止转换,返回当前已经转换好的数值,而不是直接返回0。
- 冗余头文件:代码里引入了
<string.h>但完全没用到,可以移除,符合“不依赖多余标准库”的要求。
修复后的代码
#include <assert.h> #include <stddef.h> int StringToInteger(const char *str) { int num = 0; int sign = 1; assert(str != NULL); // 处理正负号前缀 if (*str == '+' || *str == '-') { sign = (*str == '-') ? -1 : 1; str++; } // 遍历并转换数字字符 while (*str != '\0') { if (*str >= '0' && *str <= '9') { // 处理32位有符号整数溢出问题 if (num > (2147483647 / 10) || (num == 2147483647 / 10 && (*str - '0') > 7)) { return sign == 1 ? 2147483647 : -2147483648; } num = num * 10 + (*str - '0'); } else { // 遇到非数字字符,停止转换 break; } str++; } return num * sign; }
修复说明
- 移除了无用的
<string.h>头文件,严格控制依赖。 - 删除了正负号处理后的错误
return语句,保证后续数字能被正常转换。 - 循环结束后返回
num * sign,得到带正确符号的最终结果。 - 遇到非数字字符时改为
break,这样像"123abc"这类字符串会被正确转换为123。 - 添加了溢出处理逻辑,避免转换超大数字时出现未定义行为(适配32位有符号整数的范围)。
内容的提问来源于stack exchange,提问作者nitzan teharlev
相关产品推荐
相关产品推荐

