C语言实现输出数组中仅出现一次的元素 程序运行异常求助
问题修复方案
原代码核心错误点
- 遍历过程中随意修改代表数组总长度的
size变量,导致循环边界异常,逻辑完全偏离预期 - 重复判断逻辑未排除
i == j(元素和自身比较)的情况,只要匹配到相等值就直接缩短遍历长度,无法正确统计出现次数 - 赋值语句误写为相等判断:
newArr[i] == array[j];实际未给新数组赋值,新数组为未初始化的栈内存,所以输出随机乱数 - 整体筛选逻辑错误:没有统计每个元素的出现次数,无法筛选出仅出现一次的元素
修复思路
由于输入值范围固定为10~100,仅91个可能的取值,采用计数法实现最简单高效:
- 新增计数数组,长度覆盖所有可能的输入值,初始值全为0
- 遍历输入的20个有效元素,对应数值的计数位累加1
- 遍历计数数组,输出计数为1的数值即可
修正后完整代码
#include <stdio.h> int main() { const int size = 20; int array[size]; int count_map[101] = {0}; // 覆盖0~100的所有可能取值 int number = 0; // 输入20个有效数值 for(int count = 0; count < size; count++) { printf("\nAnna %d. luku > ", count+1); scanf("%d", &number); // 输入校验 while(number > 100 || number < 10) { printf("Ei kelpaa.\n"); printf("Yrita uudelleen > "); scanf("%d", &number); } array[count] = number; count_map[number]++; // 直接累加计数 } // 输出仅出现一次的元素 printf("仅出现一次的元素如下:\n"); for(int i = 10; i <= 100; i++) { if(count_map[i] == 1) { printf("%d\n", i); } } return 0; }
内容的提问来源于stack exchange,提问作者laurimikhael
相关产品推荐
相关产品推荐

