C语言调用ctype库atoi函数异常,求字符串单数字求和的解决方法
问题排查与修复方案
现有代码存在的问题
atoi函数传入参数错误:atoi要求输入参数是以\0结尾的字符串指针,你传入的是单个char类型的字符,类型不匹配直接导致运行异常。单个数字字符转对应整数值直接用字符 - '0'即可,ASCII编码中数字字符是连续排列的,该计算可直接得到对应整数值。- 循环逻辑错误:数组
input长度为15,合法下标范围是0~14,i<=15会触发数组越界访问;且不应该固定遍历16次,应该遍历到字符串结束符\0就终止,避免处理未初始化的内存内容。 - 已废弃函数使用:
gets函数存在严重的缓冲区溢出漏洞,已经从C标准中移除,建议替换为fgets。 - 输出格式不符合要求:现有代码仅输出最终结果,没有实现
数字1 + 数字2 + ... = 结果的打印逻辑。
修复后可运行代码
#include <stdio.h> #include <ctype.h> int main() { char input[15]; printf("Write smth: "); // 用fgets替代gets,指定读取长度避免溢出 fgets(input, sizeof(input), stdin); int i, result = 0; int first_digit = 1; // 标记是否是第一个数字,控制加号输出 // 遍历到字符串结束符就停止 for(i=0; input[i] != '\0'; i++) { if(isdigit(input[i])) { int num = input[i] - '0'; result += num; if(first_digit) { printf("%d", num); first_digit = 0; } else { printf(" + %d", num); } } } printf(" = %d\n", result); return 0; }
内容的提问来源于stack exchange,提问作者Dragesia
相关产品推荐
相关产品推荐

