C语言检查数组用户输入重复:输入1需第三次才触发检测的问题
问题原因分析
你的代码存在两个关键错误,导致输入1时第三次才检测到重复:
数组初始元素未被赋值
当i=0(第一次输入)时,内层循环for(int j = 0; j < i; j++)的条件j < 0不成立,循环体完全不执行。这意味着num[0]始终是内存中的随机垃圾值,不会被设置为第一次输入的数字。赋值逻辑错误
你把num[i] = input放在了内层循环的else分支里,这会导致:- 第一次输入1时,
num[0]未被赋值,仍是随机值; - 第二次输入1时,内层循环仅执行
j=0的判断:如果随机值≠1,就会把num[1]设为1,但num[0]还是随机值; - 第三次输入1时,内层循环先执行
j=0:随机值≠1,设置num[2]=1;接着执行j=1,此时num[1]等于1,才触发重复提示。
- 第一次输入1时,
其他数字看似正常,大概率是巧合——第一次输入后,num[0]的随机值刚好等于该数字,导致第二次输入时触发检测,但这不是代码逻辑正确的表现。
修复后的代码
int main() { int input; int num[16]; printf("Enter the numbers from 1 to 16 in any order:\n"); for(int i = 0; i < 16; i++){ scanf("%d", &input); int is_duplicate = 0; // 先检查是否重复 for(int j = 0; j < i; j++){ if(num[j] == input){ printf("You have already entered this number!\n"); is_duplicate = 1; i--; // 回退索引,重新接收输入 break; } } // 只有不重复时才赋值 if(!is_duplicate){ num[i] = input; } } return 0; }
修复点说明:
- 新增
is_duplicate标记,统一控制是否赋值; - 将赋值操作移到内层循环外,确保只有确认无重复时才给
num[i]赋值; - 第一次输入时(i=0),内层循环不执行,直接进入赋值分支,正确设置
num[0]。
内容的提问来源于stack exchange,提问作者CaptSellerie
相关产品推荐
相关产品推荐

