You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:36:01