不允许用户输入重复值

时间:2018-10-08 15:11:41

标签: c loops

我正在编写代码来创建C语言中的学生数据库。这不允许重复的卷号。我创建了一个结构数组,其中卷号是其中的一部分。

这是我到目前为止编写的代码。数据库中已有记录的记录,临时编号为no。此刻正在输入的记录数。 第一次检查卷号的重复检查效果很好,但是如果我重新输入相同的值,则不会。 有人可以帮我吗?

for(i=*NOR;i<temp+*NOR;i++)     //For loop to enter student details
{
    int j;
    printf("\nFor student %d:\n",i+1);
    printf("\tEnter the roll No.\n");   //Enter Roll No.
    scanf("%d",&s[i].rollNo);
    while(s[i].rollNo<0)
    {
        printf("\nPlease enter valid Roll No.\n");
        scanf("%d",&s[i].rollNo);
    }
    if(i>0)
    {
        while(1)
        {
            for(j=0;j<i;j++)    //Validation for duplicate Roll No.
            {
                if(s[i].rollNo==s[j].rollNo)
                {
                    printf("\nPlease don't enter duplicate Roll No.s\n");
                    scanf("%d",&s[i].rollNo);
                    continue;
                }
            }
            if(j==i)
                break;
        }

   //Other code

}

3 个答案:

答案 0 :(得分:0)

您第二次未获得匹配的问题是,您的重复检查在找到第一个匹配项后不会倒退

要详细说明,请在以下代码段之后

            if(s[i].rollNo==s[j].rollNo)
            {
                printf("\nPlease don't enter duplicate Roll No.s\n");
                scanf("%d",&s[i].rollNo);
                continue;
            }

您的j未设置回0,它指向找到匹配项的最后一次出现,如果您continue,则缺少该索引以及搜索中所有先前覆盖的索引

您必须从开始开始查找。

答案 1 :(得分:0)

如果您有while(1)i == 1,我认为您的j == 0是无限的。

如果我做对了,就不需要while(1)循环,请尝试将其删除。

答案 2 :(得分:0)

问题在于,在检测到重复的纸卷编号并获取新值之后,您需要对照 all 现有值检查该新值。换句话说,您需要重新开始。

如果将continue更改为休息时间,则检查应重新正确启动。

while(1)
        {
            for(j=0;j<i;j++)    //Validation for duplicate Roll No.
            {
                if(s[i].rollNo==s[j].rollNo)
                {
                    printf("\nPlease don't enter duplicate Roll No.s\n");
                    scanf("%d",&s[i].rollNo);
                    break; // check new rollNo against all other values
                }
            }
            if(j==i)
                break;
        }

请注意,break可以脱离while循环以及for循环。它总是脱离 innermost 循环。因此,第一个break离开了for循环,而第二个中断了while