如何避免用户输入数组中已存在的数字?现有代码执行异常
如何避免输入重复数字 & 修正你的代码问题
嘿,我来帮你搞定这个重复输入的问题!咱们先拆解你的疑问,再重点修复代码里的bug。
为什么你的代码首次输入就提示重复?
你当前的判断逻辑有明显问题:当第一次输入数字时,Array.IndexOf(number, number[i])返回的就是当前索引i(这是数组里第一个出现该数字的位置),然后你判断number[i] == number[getindex]——这相当于拿当前数字和它自己比,当然永远成立,所以第一次输入就会触发重复提示。另外,int数组默认初始化的元素都是0,如果输入的数字是0,还会误判和后面未赋值的0重复。
正确的实现方式
要避免输入已存在的数字,核心思路是:每次输入后,只检查已经存入数组的元素(也就是当前索引之前的元素),如果重复就要求用户重新输入,直到输入符合要求为止。这里给你修正后的代码,还加上了输入验证(防止用户输入非数字导致程序崩溃):
int[] number = new int[5]; for (int i = 0; i < number.Length; i++) { int inputNum; bool isDuplicate; do { Console.Write("Write a number : "); // 先确保输入的是有效整数 while (!int.TryParse(Console.ReadLine(), out inputNum)) { Console.WriteLine("Please enter a valid integer!"); Console.Write("Write a number : "); } // 只检查数组中已经赋值过的部分(从索引0到i-1) isDuplicate = Array.IndexOf(number, inputNum, 0, i) != -1; if (isDuplicate) { Console.WriteLine("This number already exists, please try another one."); } } while (isDuplicate); // 重复输入直到拿到不重复的数字 number[i] = inputNum; }
代码关键说明:
do-while循环:确保用户必须输入不重复的数字才会退出循环,把值存入数组Array.IndexOf(number, inputNum, 0, i):第四个参数i指定了搜索长度,意思是从索引0开始,只搜索前i个元素(已经填过值的部分),返回-1则说明没有重复int.TryParse:避免用户输入非数字导致程序崩溃,让代码更健壮
通用思路总结
不管用数组还是其他集合(比如List<int>),避免重复输入的步骤都差不多:
- 接收用户输入,并验证输入的有效性(比如是不是数字)
- 检查已存储的元素中是否包含当前输入的值
- 如果重复,提示用户重新输入;如果不重复,将值加入集合
- 用循环重复这个流程,直到输入符合要求
内容的提问来源于stack exchange,提问作者Johnny Adams
相关产品推荐
相关产品推荐

