Динамическая память и структуры - C (СИ)
Формулировка задачи:
не получается считать данные из stdin
есть структура:
есть функция создания нового элемента массива типа sudent:
n - количество записей в массиве
ошибка вылетает при попытке считать строку из stdin в q[n].name
если есть у кого соображения подскажите, а то уже пол дня убил)
typedef struct
{ char name[M];
int grade[K];
} student;int add_item (student *p, int n)
{
student *q=NULL;
q = (student *) realloc (p,(n+1)*sizeof(student));
if (q = NULL)
{
printf("Невозможно выделить память\n");
system("pause");
return n;
}
p=q;
printf("Enter last name and grades\n");
fscanf(stdin,"%s",q[n].name);
fflush();
return n+1;
}Решение задачи: «Динамическая память и структуры»
textual
Листинг программы
int add_item (student *p, int n)
{
student *q = (student *) realloc (p,(n+1)*sizeof(student));
if (q = NULL)
{
printf("Невозможно выделить память\n");
return n;
}
p=q;
printf("Enter last name and grades\n");
fscanf(stdin,"LastName - %s", q->name);
fscanf(stdin, "grade1 = %d", &q->grade[0]);
fscanf(stdin, "grade2 = %d", &q->grade[1]);
fscanf(stdin, "grade2 = %d", &q->grade[2]);
return n+1;
}
Объяснение кода листинга программы
- Функция
add_itemпринимает два аргумента: указатель на структуруstudentи целое числоn. - Внутри функции происходит выделение памяти под новый элемент структуры
studentс помощью функцииrealloc. Выделенная память будет использоваться для хранения информации о студенте. - Если выделение памяти не удалось (т.е.
reallocвернулNULL), то функция выводит сообщение об ошибке и возвращаетn. - Если выделение памяти прошло успешно, то указатель
pперенаправляется на новый блок памяти, чтобы старый указатель не указывал на уже освобожденную память. - Затем пользователю предлагается ввести имя и оценки студента.
- Используя функцию
fscanf, вводятся данные о студенте: имя и оценки. - После успешного ввода данных функция возвращает
n+1, увеличивая счетчик студентов на единицу.