fts
fts

Reputation: 141

Taking in unique inputs in a struct array in C

I am writing a program to create a structure named 'student'. I need to input various data about a particular student. Here is my program till now.

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

  }
}

In the following for loop I am checking all the previously entered 'id' values to check if there is a duplicate. In case of a duplicate, the program will exit.

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

Now instead of exiting the program I want to prompt the user to enter a different value. This goes on till he enters a unique value. How should I do it? Any help appreciated.

Upvotes: 1

Views: 1774

Answers (2)

WhozCraig
WhozCraig

Reputation: 66234

This is wrong:

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

You're passing the address of the pointer member name (i.e. you're passing a char **) to scanf() which per the format string, is expecting a char* and enough memory to hold the data it subsequently reads. This is invalid, is undefined behavior, and blindly overwrites data in the s[] array. Frankly I'm amazed this doesn't seg-fault your process.

Change this:

struct student
{
  char* name;
  int id;
  float marks_1;
  float marks_2;
};

To this:

struct student
{
  char name[128]; // or some other suitable size.
  int id;
  float marks_1;
  float marks_2;
};

And change this:

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

To this:

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

I strongly suggest a size-limiter on that scanf() call as well, but I leave that to you to discover. Read about the API here.

Upvotes: 3

Just use a loop.

here is some psudocode

bool isDuplicate = false

do
{
    GetInput()
    isDuplicate = CheckForDuplicate()

}while(isDuplicate);

Upvotes: 0

Related Questions