我正在编写一个程序来创建一个名为'student'的结构。我需要输入关于特定学生的各种数据。这是我的计划,直到现在。
#include<stdio.h>
#include<stdlib.h>
struct student
{
char* name;
int id;
float marks_1;
float marks_2;
};
void main()
{
int num, var_i, var_j, var_k, var_l, duplicated_id = 0;
printf("Enter number of students\n");
scanf("%d", &num);
struct student s[num];
printf("Enter the data for the students\n");
for (var_i = 0; var_i < num; var_i++)
{
var_j = var_i + 1;
printf("Enter name of student_%d\n", var_j);
scanf(" %[^\n]%*c", &s[var_i].name);
printf("Enter id of student_%d\n", var_j);
scanf("%d", &s[var_i].id);
for (var_k = 0; var_k < var_i; var_k++)
{
if (s[var_k].id == s[var_i].id)
{
printf("Duplicate Id, program will exit");
return;
}
}
printf("Enter marks(sub_1) of student_%d\n", var_j);
scanf("%d", &s[var_i].marks_1);
printf("Enter marks(sub_2) of student_%d\n", var_j);
scanf("%d", &s[var_i].marks_2);
}
}
在以下for循环中,我检查所有先前输入的'id'值以检查是否存在重复。如果有重复,程序将退出。
for(var_k=0;var_k<var_i;var_k++)
{
if(s[var_k].id==s[var_i].id)
{
printf("Duplicate Id, program will exit");
return;
}
}
现在,我想提示用户输入不同的值,而不是退出程序。这一直持续到他输入一个独特的价值。我该怎么办? 任何帮助表示赞赏。
答案 0 :(得分:3)
这是错误的:
scanf(" %[^\n]%*c", &s[var_i].name);
您正在将指针成员name
的地址(即您传递char **
)传递给scanf()
,其格式字符串为期待char*
和足够的内存来保存随后读取的数据。这是无效的,未定义的行为,并盲目地覆盖s[]
数组中的数据。坦率地说,我很惊讶这不会对你的过程造成错误。
改变这个:
struct student
{
char* name;
int id;
float marks_1;
float marks_2;
};
对此:
struct student
{
char name[128]; // or some other suitable size.
int id;
float marks_1;
float marks_2;
};
并改变这一点:
scanf(" %[^\n]%*c", &s[var_i].name);
对此:
scanf(" %[^\n]%*c", s[var_i].name);
我强烈建议在scanf()
电话上设置尺寸限制器,但我会留给您发现。了解API here。
答案 1 :(得分:0)
只需使用循环。
这里有一些psudocode
bool isDuplicate = false
do
{
GetInput()
isDuplicate = CheckForDuplicate()
}while(isDuplicate);