浮点异常(core dumped)排查:求奇偶输入平均值程序报错定位
错误原因分析及修复方案
1. 局部变量未初始化引发的核心问题
C语言中局部变量默认会被分配随机垃圾值,你的代码里evenTotal、evenCount、oddTotal、oddCount、numReturn都没初始化:
- 启动程序时
numReturn是随机值,可能直接不满足numReturn !=0的循环条件,跳过输入逻辑。 - 若用户直接输入0结束程序,
evenCount或oddCount还是初始的垃圾值(大概率为0),执行evenTotal/evenCount或oddTotal/oddCount时会触发除以0,这就是Floating point exception (core dumped)错误的直接原因。
2. 终止条件0被错误统计
当输入0时,程序会进入偶数统计分支,把0算入偶数总和和计数,但0是终止信号,不该被纳入统计。
修复后的代码
#include <stdio.h> int main() { int numReturn = 1; // 初始化非0值,确保进入循环 int evenTotal = 0; int evenCount = 0; int oddTotal = 0; int oddCount = 0; while(numReturn != 0){ printf("Enter a positive integer: "); scanf("%d",&numReturn); if(numReturn < 0){ printf("That's a negative number!\n"); } else if(numReturn == 0){ // 0是终止条件,跳过统计 continue; } else if(numReturn % 2 == 0){ evenTotal += numReturn; evenCount += 1; } else { oddTotal += numReturn; oddCount += 1; } } // 先判断计数是否为0,避免除以0 double evenAvg = (evenCount == 0) ? 0.0 : (double)evenTotal / evenCount; double oddAvg = (oddCount == 0) ? 0.0 : (double)oddTotal / oddCount; printf("%d even numbers were entered and the average is %.2lf\n", evenCount, evenAvg); printf("%d odd numbers were entered and the average is %.2lf\n", oddCount, oddAvg); return 0; }
修复说明
- 所有局部变量初始化,消除垃圾值干扰。
- 单独处理输入0的情况,不纳入统计逻辑。
- 计算平均值前判断计数是否为0,彻底避免除以0异常。
- 加入
(double)强制类型转换,把整数除法转为浮点除法,保证平均值的小数精度(原代码中整数除法会丢失小数部分)。
内容的提问来源于stack exchange,提问作者PapaPumpkin
相关产品推荐
相关产品推荐

