В инструкциях сказано:
создать массив указателей на структуру Student
struct Student std[5] ;
- это массив структур, а не массив указателей. Массив указателей выглядит следующим образом:
struct Student* std[5] ;
Затем необходимо выделить память для каждой Student
структуры.
for (i = 0; i < 5; i++) {
std[i] = malloc(sizeof(*std[i]));
ptr = std[i];
...
}
Другая проблема заключается в том, что char charGrade[1];
недостаточно велик для держать строку с оценкой. Строка нуждается в дополнительном символе для нулевого терминатора, поэтому 1-символьная строка должна быть объявлена char charGrade[2];
. То же самое касается typeG
(хотя я не уверен, почему вы в первую очередь используете для этого строку, похоже, это должна быть int
).
Полная исправленная программа это:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct StuGrade{
int intGrade;
char charGrade[2];
};
struct Student{
char ID[20];
char typeG[2];
struct StuGrade Grade;
};
int main(){
int i = 0;
struct Student* std[5] ;
for (i = 0; i < 5; i++) {
std[i] = malloc(sizeof(*std[i]));
ptr = std[i];
printf("Enter ID: ");
scanf("%s", ptr->ID);
printf("0 for char grade or 1 for int grade:");
scanf("%s", ptr->typeG);
if(strcmp(ptr->typeG,"0") == 0){
printf("Enter a char grade:");
scanf("%s", ptr->Grade.charGrade);
}else{
printf("Enter an int grade:");
scanf("%d", &ptr->Grade.intGrade);
}
}
i =0;
printf("***Student(s) who take grade 'A' is/are***");
for (i = 0; i < 5; i++) {
ptr = std[i];
if(strcmp(ptr->Grade.charGrade,"A") == 0){
printf("\nID : %s",ptr->ID);
printf("\nGrade: %s",ptr->Grade.charGrade);
}
if(ptr->Grade.intGrade >= 90){
printf("\nID : %s",ptr->ID);
printf("\nGrade: %d",ptr->Grade.intGrade);
}
}
return 0;
}