C语言数组插入平均值后0的计数多1次问题排查
问题原因与修复方案
核心问题定位
- 插入逻辑存在数组越界访问:你的插入遍历循环写的是
for (i = 0; i < length; i++),但判断条件中访问了array[i+1],当i等于length-1(也就是当前数组最后一个元素的下标)时,i+1已经超出了数组的有效范围,读取的是栈上未初始化的垃圾值(你输出末尾出现的2.33412e-310就是这个垃圾值)。
当输入全0时,这个垃圾值如果刚好和0的差值小于你定义的EPSILON,就会触发额外的插入操作,导致数组长度从预期的199变成200,最终统计0的出现次数就多了1次,得到200的错误结果。 - 统计逻辑不符合设计需求:你当前的统计代码
digit = ((int)(temp * 10)) % 10实际统计的是每个数值小数点后第一位的数字,而非数值本身的出现次数,和你描述的「统计各数字的出现次数」需求不匹配。 - 输入读取存在潜在问题:你给出的输入示例是连续的100个0,用
%lf循环读取时,连续的数字会被识别为单个浮点数,导致后续99次scanf阻塞等待输入。如果要读取100个独立的0,输入时需要用空格/换行分隔每个输入值。
修复代码
#include <math.h> #include <stdio.h> #define EPSILON 0.0001 int main() { int n, i, j, length = 0, count_0 = 0; // 扩大数组容量,避免插入后越界 double array[300], temp; do { printf("Enter number of elements: "); scanf("%d", &n); } while (n <= 0 || n >= 101); printf("Enter elements: "); length = n; for (i = 0; i < length; i++) scanf("%lf", &array[i]); // 修复循环条件,保证i+1是有效元素 for (i = 0; i < length - 1; i++) { temp = array[i] * 2; if (fabs(temp - array[i + 1]) < EPSILON) { for (j = length; j > i + 1; j--) array[j] = array[j - 1]; array[i + 1] = (array[i] + array[i + 1]) / 2.; // 跳过新插入的元素,避免重复判断 i++; length++; } } printf("After adding middle element: \n"); for (i = 0; i < length; i++) printf("%g ", array[i]); printf("\n"); // 示例统计逻辑:统计0的出现次数,可按需扩展统计其他数值 for (i = 0; i < length; i++) { if (fabs(array[i] - 0) < EPSILON) { count_0++; } } printf("Number 0 is repeated %d time/s.\n", count_0); return 0; }
内容的提问来源于stack exchange,提问作者casual
相关产品推荐
相关产品推荐

