C语言重复元素消除实验代码调试求助
C语言数组去重问题:多重复输入错误排查与修复
需求说明
读取10个范围在[10,100]的整数,每读取一个数,仅当它不是已读取数的重复值时才打印。需考虑最坏情况(10个数均不同),使用最小规模的数组。
现有代码核心问题分析
你的代码存在多处逻辑错误,导致多重复输入时输出异常:
- isDuplicate函数逻辑错误:
- 遍历整个
initialArray(固定SIZE=10),但数组中只有前locCtr个元素是有效输入,其余为未初始化的垃圾值,会导致误判重复; - 单次重复输入调用两次
isDuplicate,导致重复打印"Duplicate found!"。
- 遍历整个
- removeElement函数完全偏离需求:
- 函数仅过滤数组中的0值,未实现"移除重复元素"的逻辑,无法正确生成去重后的数组;
- 每次调用都会分配新内存,但未释放旧的
newArray,造成内存泄漏。
- newArray维护逻辑缺失:
- 仅初始化第一个元素,后续非重复元素未同步更新到
newArray; - 用
newSize = SIZE - 重复次数的方式维护数组大小,未跟踪实际有效去重元素的数量,导致数组越界或读取垃圾值。
- 仅初始化第一个元素,后续非重复元素未同步更新到
- printArray函数循环错误:
- 循环范围
i < SIZE - 1会漏掉倒数第二个元素,打印格式存在缺陷。
- 循环范围
修复后的完整代码
header.h
int isDuplicate(int* array, int count, int input); void printArray(int* array, int size);
functions.c
#include <stdio.h> #include "header.h" // 判断input是否在array的前count个元素中重复 int isDuplicate(int* array, int count, int input) { for (int i = 0; i < count; i++) { if (array[i] == input) { return 1; } } return 0; } // 正确打印数组所有元素 void printArray(int* array, int size) { if (size == 0) { printf("[]\n"); return; } printf("[%d", array[0]); for (int i = 1; i < size; i++) { printf(" %d", array[i]); } printf("]\n"); }
main.c
#include <stdio.h> #include <stdlib.h> #include "header.h" int main() { // initialArray存储所有输入(含重复),最坏情况10个元素 int* initialArray = malloc(sizeof(int) * 10); // newArray存储去重后的元素,初始按最坏情况分配10个元素空间 int* newArray = malloc(sizeof(int) * 10); int input = 0; // 已输入的总个数(含重复) int inputCount = 0; // 去重后的有效元素个数 int uniqueCount = 0; printf("Welcome! Please enter your 10 numbers, between 10 and 100, inclusive!\n"); while (inputCount < 10) { scanf("%d", &input); if (input >= 10 && input <= 100) { // 先把输入存入initialArray initialArray[inputCount] = input; // 判断是否是重复值(只检查已去重的元素) if (!isDuplicate(newArray, uniqueCount, input)) { printf("Value: %d\n", input); newArray[uniqueCount] = input; uniqueCount++; } else { printf("Duplicate found!\n"); } inputCount++; } else { printf("Invalid input! Please enter your numbers in the interval of [10,100]!\n"); } } printf("Your initial array is: "); printArray(initialArray, 10); printf("Your final array is: "); printArray(newArray, uniqueCount); printf("Bye bye!\n"); // 释放内存 free(initialArray); free(newArray); return 0; }
修复逻辑说明
- 简化去重判断:直接用
newArray(已去重的元素)来判断新输入是否重复,避免遍历无效的未初始化内存; - 维护有效元素计数:用
uniqueCount跟踪去重后的元素数量,无需每次重复都重新分配数组,内存使用更高效; - 避免内存泄漏:仅在初始时分配一次数组空间,无需频繁调用
malloc/realloc,最后统一释放; - 修正打印逻辑:确保数组所有元素都被正确打印,处理空数组的边界情况。
测试验证
用你的测试案例输入:
10 20 30 40 40 50 50 60 75 80
输出结果:
Welcome! Please enter your 10 numbers, between 10 and 100, inclusive! Value: 10 Value: 20 Value: 30 Value: 40 Duplicate found! Value: 50 Duplicate found! Value: 60 Value: 75 Value: 80 Your initial array is: [10 20 30 40 40 50 50 60 75 80] Your final array is: [10 20 30 40 50 60 75 80] Bye bye!
内容的提问来源于stack exchange,提问作者Phoebus Apollon
相关产品推荐
相关产品推荐

