如何以优雅方式检查数组元素是否已存在?C语言代码优化需求
优化重复元素检查的C语言数组输入程序
任务要求
- 创建一个包含20个元素的数组
- 手动向数组插入20个范围在10到100(包含边界值)的整数
- 若输入数字不满足
10 ≤ x ≤ 100,提示输入无效并要求重新输入 - 若输入的有效数字是首次插入(数组中不存在该元素),则打印该数字;重复数字不计入需插入的20个数字中
原代码存在的问题
原代码通过大量嵌套if语句检查元素是否重复,不仅效率低下、逻辑冗余,还存在数组越界风险(比如当i=0时访问a[i-1]);同时使用goto语句导致程序流程混乱,输入错误时会从头开始循环,用户体验差。
优化后的代码
#include <stdio.h> #define SIZE 20 // 检查数字是否已存在于数组的前count个元素中 int isDuplicate(int num, int arr[], int count) { for (int i = 0; i < count; i++) { if (arr[i] == num) { return 1; // 存在重复 } } return 0; // 不存在重复 } int main() { int a[SIZE]; int insertedCount = 0; // 已插入的有效不重复数字数量 while (insertedCount < SIZE) { int input; printf("请输入第%d个数字(共需输入20个,范围10-100):\n", insertedCount + 1); // 处理输入格式错误(比如输入非整数) if (scanf("%d", &input) != 1) { printf("输入无效,请输入整数!\n"); // 清空输入缓冲区 while (getchar() != '\n'); continue; } // 检查输入范围 if (input < 10 || input > 100) { printf("输入无效,请输入10到100之间的整数!\n"); continue; } // 检查是否重复 if (isDuplicate(input, a, insertedCount)) { printf("该数字已存在,请重新输入!\n"); continue; } // 插入并打印 a[insertedCount] = input; printf("已插入有效数字:%d\n", input); insertedCount++; } printf("20个不重复的有效数字已全部插入完成!\n"); return 0; }
优化说明
- 重复检查优化:用独立函数
isDuplicate配合循环遍历已插入元素,替代嵌套if,逻辑清晰且避免数组越界,时间复杂度更可控 - 流程控制优化:去掉
goto,改用while循环跟踪已插入数量,输入错误时仅重新输入当前值,提升用户体验 - 输入健壮性提升:增加了非整数输入的处理,清空输入缓冲区避免死循环
- 逻辑清晰度提升:用
insertedCount明确跟踪有效元素数量,避免原代码中i--的混乱逻辑
内容的提问来源于stack exchange,提问作者Gisvaldo
相关产品推荐
相关产品推荐

