Неправильно записывается строка в языке С
Вот моя функция для добавления нового студента в "базу данных".
int Add(Student* database, int count) {
struct Student student;
puts("\nВведите ID студента: ");
scanf("%du", &database[count].ID);
fflush(stdin);
puts("\nВведите ФИО студента: ");
scanf("%s", &database[count].FIO);
fflush(stdin);
char sex;
puts("\nВведите пол студента( М или Ж ): ");
scanf(" %c", &sex);
student.sex = sex;
int groupNumber;
printf("\nВ какую группу студент зачислен? (1, 2 или 3)\n\nВаш выбор: ");
scanf("%d", &groupNumber);
student.groupNumber = groupNumber;
database[count] = student;
count++;
return count;
}
Проблема в следующем: Когда ввожу ФИО, неважно на каком языке, вместо строки записывается "ММММММММММММММММММММММММММММММММММММ". Перепробовала много всего, но ничего не помогает.
Прикладываю структуру на всякий случай:
struct Student {
int ID;
char FIO[100];
char sex;
int groupNumber;
};
Ответы (1 шт):
В структуре struct Student
элемент char FIO[100]
является указателем на char
, таким образом, в
scanf("%s", &database[count].FIO);
вы берете указатель на указатель. Поэтому достаточно указать
scanf("%s", database[count].FIO);
Отвечая на вопрос, почему в этом поле лежат одни буквы "М", скорее всего это происходит из-за того, что память под "базу данных" вы выделяете с помощью malloc()
, который никак не санитизирует выделенную память. Чтобы в дальнейшем избегать проблем с "мусором", который может лежать на куче, старайтесь занулять полученный участок памяти:
struct Student *s = (struct Student *)malloc(nStudents * sizeof(struct Student));
memset(s, 0, nStudents * sizeof(struct Student));
либо
struct Student *s = (struct Student *)calloc(nStudents, sizeof(struct Student));