在C中的结构数组中接受唯一输入

时间:2013-08-23 15:35:04

标签: c arrays struct

我正在编写一个程序来创建一个名为'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;
  }
}

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

2 个答案:

答案 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);