C语言校验用户输入数组数字不重复的代码运行异常如何解决
问题排查与修复方案
核心错误点
- 循环体语法错误:
for (i=0; i<n; i++)后未用大括号包裹全部循环逻辑,导致只有scanf ("%d",&num);被循环执行n次,后续判重、赋值逻辑都不属于for循环,只会在for循环结束(i等于n)后执行一次,还会触发数组越界访问。 - 判重逻辑错误:仅对比
num == N[i],而N[i]是未初始化的垃圾值,且需要和之前已经存入数组的所有元素逐一对比才能判断是否重复。 - 重复处理逻辑缺失:检测到重复后没有阻止赋值、也没有要求用户重新输入,i依然会自增,无法实现去重效果。
修复后可运行代码
#include<stdio.h> int main () { int n; int i, j; int num, is_dup; printf("请输入你要录入的数字总数 \n"); scanf("%d",&n); int N[n]; printf("请输入你的数字 \n"); for (i=0; i<n; i++) { scanf ("%d",&num); // 判重逻辑:和之前已经存入的所有元素比对 is_dup = 0; for (j=0; j<i; j++) { if (num == N[j]) { is_dup = 1; break; } } if (is_dup) { printf("你已经输入过这个数字,请重试\n"); i--; // 重复的话i不自增,让用户重新输入当前位置的数 continue; } N[i]=num; printf("____________ \n"); } // 以下为验证数组存储的测试代码,可根据需求删除 printf("你输入的不重复数组为:"); for(i=0; i<n; i++) { printf("%d ", N[i]); } getchar(); getchar(); return 0; }
关键修改说明
- 把所有循环逻辑包裹在for循环的大括号内,确保每次输入后都会执行判重、赋值操作
- 新增内层循环遍历已存入的数组元素,逐一判断新输入数字是否重复
- 新增重复标记变量
is_dup,检测到重复后将i减1抵消本次循环的i自增,让用户重新输入对应位置的数字,跳过后续赋值逻辑
内容的提问来源于stack exchange,提问作者Carmen
相关产品推荐
相关产品推荐

