C语言实现数组录入时禁止用户输入重复数值的方法
实现思路与代码修正
现有代码存在的问题
- 变长数组定义逻辑错误:你在n未完成输入、初始值为0时就定义了
int N[n],后续输入的n不会改变数组长度,会导致访问越界。 - 程序提前退出:
return 0错误放在for循环内部,第一次录入数值后就会直接终止程序,无法完成n个值的录入。 - 冗余的输入处理:两处
getchar()没有实际作用,反而会阻塞程序等待额外输入。
去重功能实现思路
你要求数值范围限定在0-50之间,有两种常用的实现方案:
方案1:标记数组法(推荐,时间复杂度O(n))
- 额外定义一个长度为51的整型数组
used,初始值全部设为0,对应0-50每个数值的使用状态 - 每次输入有效数值后,先检查
used[num]是否为1:如果是1说明已录入过,提示重复并要求重新输入;如果是0就将used[num]设为1,再把数值存入目标数组
方案2:遍历校验法(适合数值范围不固定的场景)
- 每次输入有效数值后,遍历数组中已经存入的前i个元素,逐个和当前输入值对比
- 如果发现相同值,提示重复并要求重新输入;如果遍历完没有重复,再把数值存入数组的第i位
修正后完整参考代码
#include <stdio.h> #include <stdlib.h> int main(){ int n = 0, num = 0, i; int* N; int used[51] = {0}; // 标记0-50的数值是否已被使用 printf("请输入你要录入的数值个数:\n"); do { scanf("%d", &n); // 0-50之间最多只有51个不重复数值,所以n不能超过51 if(n < 0 || n > 51) { printf("数值个数无效,请输入0-51之间的数,重试:\n"); } } while (n < 0 || n > 51); // 确定n的取值后再分配存储数组的内存 N = (int*)malloc(n * sizeof(int)); if(N == NULL) { printf("内存分配失败\n"); return 1; } printf("请输入0-50之间的数值:\n"); for(i = 0; i < n; i++) { printf("请输入第%d个数值:\n", i+1); do { scanf("%d", &num); // 先校验数值范围 if(num < 0 || num > 50) { printf("数值超出0-50范围,重试:\n"); } // 再校验是否重复 else if(used[num] == 1) { printf("该数值已录入过,重试:\n"); } // 校验通过后存储数值 else { used[num] = 1; N[i] = num; printf("录入成功\n-----\n"); break; } } while(1); } // 可选:输出所有录入的数值验证结果 printf("录入完成,所有数值为:"); for(i = 0; i < n; i++) { printf("%d ", N[i]); } printf("\n"); free(N); return 0; }
内容的提问来源于stack exchange,提问作者Carmen
相关产品推荐
相关产品推荐

