C语言除法函数IDE运行正常 自动检测报内存与运行时错误求助
核心错误点
- 循环条件致命错误
- 运算符写反:
opt =! 'd'是赋值逻辑,等价于将!'d'的结果(0)赋值给opt,并非你想写的opt != 'd'判断逻辑 - 逻辑运算符错误:三个不等判断用
||连接是恒成立的,不管opt输入什么值,至少会满足两个不等条件,直接触发死循环
- 运算符写反:
- 交互逻辑不兼容自动测试环境
自动校验是无人工输入的运行环境,你代码中的scanf无法读取到有效输入,要么阻塞要么读到随机值,结合上面的死循环,很快会触发内存溢出,也就是你遇到的32/8用例的MemoryError - 负数除法逻辑错误
C语言中%运算的余数符号和被除数保持一致,你做四舍五入判断的rest * 2 < num2逻辑没有考虑除数为负的场景,32/-8这类负除数用例会触发逻辑异常,导致运行时错误 - 冗余逻辑&未定义变量风险
32/8这类余数为0的场景完全不需要用户选择处理方式,额外触发交互逻辑属于多余设计;另外poscount和negcount如果没有在函数外全局声明,属于未定义变量,访问时也会触发非法内存访问错误
修复建议
- 先修改循环条件:正确的循环继续条件应该是
opt != 'd' && opt != 'c' && opt != 'r',注意运算符是!=,逻辑符是&& - 优先判断余数是否为0:如果
rest == 0直接返回num1 / num2,不需要走交互逻辑 - 如果作业要求自动校验不需要交互,直接去掉所有
printf、scanf相关的交互代码,按照作业要求的默认规则(比如默认截断/默认四舍五入)直接返回计算结果即可 - 补充负数场景的四舍五入判断,以及num2为0的除零错误处理
- 确保
poscount和negcount已经在全局作用域正确声明
内容的提问来源于stack exchange,提问作者user15967184
相关产品推荐
相关产品推荐

