Taking in unique inputs in a struct array in C -


i writing program create structure named 'student'. need input various data particular student. here 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 data students\n");   (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);     (var_k = 0; var_k < var_i; var_k++)     {       if (s[var_k].id == s[var_i].id)       {         printf("duplicate id, program 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 following loop checking entered 'id' values check if there duplicate. in case of duplicate, program exit.

for(var_k=0;var_k<var_i;var_k++) {    if(s[var_k].id==s[var_i].id)   {     printf("duplicate id, program exit");     return;   } } 

now instead of exiting program want prompt user enter different value. goes on till enters unique value. how should it? appreciated.

this wrong:

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

you're passing address of pointer member name (i.e. you're passing char **) scanf() per format string, expecting char* , enough memory hold data subsequently reads. invalid, undefined behavior, , blindly overwrites data in s[] array. frankly i'm amazed doesn't seg-fault process.

change this:

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

to this:

struct student {   char name[128]; // or 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 suggest size-limiter on scanf() call well, leave discover. read api here.


Comments

Popular posts from this blog

java - Run a .jar on Heroku -

java - Jtable duplicate Rows -

validation - How to pass paramaters like unix into windows batch file -