C语言实现数字序列按运算符运算出错 同逻辑Python正常 求错误原因
问题描述
我需要实现对输入的数字序列按紧随其后的运算符序列进行计算的功能。我编写的C语言实现代码运行无报错但返回结果错误,相同逻辑在Python中可以正常运行,我是初次接触C语言,无法定位问题,求帮忙排查错误。
原C语言代码
{ int res = strtol(arguments[2], NULL, 10); int number_of_elements = strtol(arguments[1], NULL, 10); for(int i = 2; i <= number_of_elements; i++) { if(*arguments[number_of_elements + i] == '+') { res += *arguments[i + 1]; } else if(*arguments[number_of_elements + i] == '-') { res -= *arguments[i + 1]; } else if(*arguments[number_of_elements + i] == '*') { res *= *arguments[i + 1]; } else if(*arguments[number_of_elements + i] == '/') { res /= *arguments[i + 1]; } } return res; }
可正常运行的Python代码
command = args[0] number_of_elements = args[1] res = args[2] for i in range(2, number_of_elements + 1): if args[number_of_elements + i] == '+': res += args[i + 1] print(f"{res} {args[number_of_elements + i]} {args[i + 1]} = {res + args[i+1]}") elif args[number_of_elements + i] == '-': res -= args[i + 1] print(f"{res} {args[number_of_elements + i]} {args[i + 1]} = {res - args[i+1]}") elif args[number_of_elements + i] == '*': res *= args[i + 1] print(f"{res} {args[number_of_elements + i]} {args[i + 1]} = {res - args[i+1]}") elif args[number_of_elements + i] == '/': res //= args[i + 1] print(f"{res} {args[number_of_elements + i]} {args[i + 1]} = {res - args[i+1]}") print(res)
错误排查与修复
错误原因
核心错误为数值类型转换不当:
- C语言中
arguments为字符串数组,arguments[i+1]存储的是数字对应的字符串形式,直接用*arguments[i+1]取到的是字符串首个字符对应的ASCII码值,例如字符串"5"对应的取值为字符'5'的ASCII值53,而非数值5,直接参与运算必然得到错误结果。 - Python代码能正常运行是因为传入的
args数组中数字参数已经提前转换为了整型,不需要额外处理字符串转数值的逻辑。
修复方案
将参与运算的数字字符串统一转换为整型数值后再参与计算,同时可按需补充除数为0的异常判断逻辑。
修复后C语言代码
{ int res = strtol(arguments[2], NULL, 10); int number_of_elements = strtol(arguments[1], NULL, 10); for(int i = 2; i <= number_of_elements; i++) { int current_num = strtol(arguments[i + 1], NULL, 10); char op = *arguments[number_of_elements + i]; if(op == '+') { res += current_num; } else if(op == '-') { res -= current_num; } else if(op == '*') { res *= current_num; } else if(op == '/') { // 可自行补充除数为0的异常处理逻辑 res /= current_num; } } return res; }
内容的提问来源于stack exchange,提问作者Mostafa Mohamed Mostafa
相关产品推荐
相关产品推荐

