我正在编写代码来创建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
}
答案 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
。