1

我正在编写一个程序来创建一个名为“学生”的结构。我需要输入有关特定学生的各种数据。这是我到现在为止的程序。

#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;
  }
}

现在,我不想退出程序,而是要提示用户输入不同的值。这一直持续到他输入一个唯一值。我该怎么做?任何帮助表示赞赏。

4

2 回答 2

3

这是错误的:

scanf(" %[^\n]%*c", &s[var_i].name);

您正在传递指针成员的地址name(即您正在传递 a 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 的信息。

于 2013-08-23T17:23:52.763 回答
0

只需使用一个循环。

这是一些伪代码

bool isDuplicate = false

do
{
    GetInput()
    isDuplicate = CheckForDuplicate()

}while(isDuplicate);
于 2013-08-23T15:39:16.523 回答