Вы выбрали несколько необычных идиом для представления того, что вы пытаетесь сделать.Вот код, который более понятен и устраняет проблему.Обратите внимание, я предполагаю, что у вас есть современный компилятор Си.Стиль вашего кода - C89.Это 1989 год. Если это вариант, вы должны использовать более новые функции языка C.
Сначала создайте строковый метод в верхнем регистре, чтобы избежать дублирования кода:
void strtoupper(char *s) {
for (char *p = s; *p; ++p) *p = toupper(*p);
}
Теперь остальные:
int sizeOfDatabase;
Registration *database;
scanf("%d", &sizeOfDatabase);
database = malloc(sizeOfDatabase * sizeof *database); // NO CAST HERE!
for (int i = 0; i < sizeOfDatabase; ++i){
Registration *r = database + i;
scanf("%lu%63s%hu", &r->aem, r->name, &r->lessonsToPass);
strtouper(r->name);
}
Вы должны передать указатель на размер базы данных, чтобы метод add
мог его обновить.При правильном вызове realloc
он неэффективен, поскольку для каждого вызова требуется время, пропорциональное размеру базы данных.Если это когда-нибудь станет большим, вы бы пожалели об этом.Но это прекрасный момент, который мы проигнорируем.
void add(char *aem, char *name, char *lessonsToPass,
Registration **database, int *dbSize) {
int i = (*dbSize)++; // Increase db size by 1 and get new element's index.
Registration *db = *database = realloc(*database, *dbSize * sizeof **database);
Registration *r = db + i;
strcpy(r->name, name); // DON'T MODIFY THE INPUT.
strtoupper(r->name);
r->aem = atoi(aem);
r->lessonsToPass = atoi(lessonsToPass);
}
Надеюсь, это имеет смысл.