自定义atoi()函数异常:乘法程序输出0而非预期值问题排查
问题分析与修复:自定义atoi导致两数相乘输出0
核心Bug点
- 未初始化的
flag变量:int flag;未赋初始值,程序运行时flag会是随机垃圾值,导致后续逻辑判断完全不可靠。 - 错误的数字终止逻辑:在处理单个数字字符时,错误检查
str[i+1]是否为数字,若遇到字符串末尾的'\0'(非数字),就将flag设为0并中断循环,最终返回0。这直接导致"2"、"3"这类合法单数字字符串被判定为无效输入,返回0,相乘结果自然为0。
修复后的代码
#include <stdio.h> int myatoi(char* str) { int i = 0, result = 0, sign = 1, flag = 0; // 初始化flag为0,标记是否处理过有效数字 /** Check for whitespace */ while (str[i] == ' ') i++; /** Check for sign of the first num */ if (str[i] == '-') { sign = -1; i++; } for (; str[i] != '\0'; i++) { if (str[i] >= '0' && str[i] <= '9') { result = result * 10 + (str[i] - '0'); flag = 1; // 标记已处理有效数字 } else { break; // 遇到非数字字符,终止转换 } } if (flag == 0) return 0; // 未处理任何有效数字,返回0 return sign * result; } int main(int argc, char *argv[]) { int i, result = 1; if (argc < 3) // 两数相乘需至少传入2个数字参数,优化判断条件 { printf("Error: Please input two numbers\n"); return 1; } for (i = 1; i < argc; i++) { result = result * myatoi(argv[i]); } printf("%d\n", result); return 0; }
修复细节说明
- 初始化
flag:将flag初始化为0,仅当处理到有效数字时设为1,确保后续判断逻辑稳定可靠。 - 移除错误的
str[i+1]判断:遵循atoi函数的常规逻辑——只要当前字符是数字就累加,遇到非数字字符直接终止循环,不再错误判定单数字字符串为无效输入。 - 优化参数检查:原代码判断
argc < 2不符合两数相乘的需求,改为argc < 3并给出明确错误提示,避免用户传入不足参数时的模糊报错。
测试验证
运行./exe 2 3,myatoi("2")返回2,myatoi("3")返回3,相乘结果为6,符合预期。
内容的提问来源于stack exchange,提问作者Augusta Fidelix
相关产品推荐
相关产品推荐

