@Ben_r007

Проблемы с вводом scanf. Как исправить?

Здравствуйте.
Задача - разработать программу, содержащую односвязный линейный список студентов.
В структуре должны быть такие поля:
id;
ФИО;
Пол;
Год рождения;
Курс;
Группа;
Оценки по 5 произвольным предметам.
Со всем вроде справился, но при вводе пола, программа успешно вылетает.
Пожалуйста, посмотрите, что тут сделано не так? Какие проблемы с вводом?

#include <stdio.h>
#include <string.h>
#include <windows.h>
#define MAX 10
#define KOL 15

struct Student
{
    int id;
    char LastName[KOL];
    char FirstName[KOL];
    char Patronymic[KOL];
    char Gender;
    int Year_of_birth;
    int Course;
    char Group[KOL];
    int MathRating;
    int EnglishRating;
    int UkrainianRating;
    int ProgrammingRating;
    int PhilosophyRating;
    struct Student* nextStudent;
};

void InitStudentList(struct Student** student)
{
    *student = (struct Student*)
        malloc(sizeof(struct Student));
    (*student)->id = 1;
    printf("Введите фамилию 1 студента: ");
    scanf("%s", (*student)->LastName);
    printf("Введите имя 1 студента: ");
    scanf("%s", (*student)->FirstName);
    printf("Введите отчество 1 студента: ");
    scanf("%s", (*student)->Patronymic);
    printf("Введите пол 1 студента: ");
    scanf("%s", (*student)->Gender);
    printf("Введите год рождения 1 студента: ");
    scanf("%d", &(*student)->Year_of_birth);
    printf("Введите курс 1 студента: ");
    scanf("%d", &(*student)->Course);
    printf("Введите группу 1 студента: ");
    scanf("%s", (*student)->Group);
    printf("Введите оценку по Высшей математике 1-го студента: ");
    scanf("%d", &(*student)->MathRating);
    printf("Введите оценку по иностранному языку 1 студента: ");
    scanf("%d", &(*student)->EnglishRating);
    printf("Введите оценку по Украинскому языку 1 студента: ");
    scanf("%d", &(*student)->UkrainianRating);
    printf("Введите оценку по программированию 1 студента: ");
    scanf("%d", &(*student)->ProgrammingRating);
    printf("Введите оценку по философии 1 студента: ");
    scanf("%d", &(*student)->PhilosophyRating);
    printf("\n");
    (*student)->nextStudent = NULL;
    struct Student* endStudent = *student;
    for (int i = 2; i <= MAX; i++)
    {
        endStudent->nextStudent =
            (struct Student*) malloc(sizeof(struct Student));
        endStudent = endStudent->nextStudent;
        endStudent->id = i;
        printf("Введите фамилию %d студента: ", i);
        scanf("%s", endStudent->LastName);
        printf("Введите имя %d студента: ", i);
        scanf("%s", endStudent->FirstName);
        printf("Введите отчество %d студента: ", i);
        scanf("%s", endStudent->Patronymic);
        printf("Введите пол %d студента: ", i);
        scanf("%s", endStudent->Gender);
        printf("Введите год рождения %d студента: ", i);
        scanf("%d", endStudent->Year_of_birth);
        printf("Введите курс %d студента: ", i);
        scanf("%d", endStudent->Course);
        printf("Введите группу %d студента: ", i);
        scanf("%s", endStudent->Group);
        printf("Введите оценку по Высшей математике %d студента: ", i);
        scanf("%d", endStudent->MathRating);
        printf("Введите оценку по Иностранному языку %d студента: ", i);
        scanf("%d", endStudent->EnglishRating);
        printf("Введите оценку по Украинскому языку %d студента: ", i);
        scanf("%d", endStudent->UkrainianRating);
        printf("Введите оценку по программированию %d студента: ", i);
        scanf("%d", endStudent->ProgrammingRating);
        printf("Введите оценку по философии %d студента: ", i);
        scanf("%d", endStudent->PhilosophyRating);
        printf("\n");
        endStudent->nextStudent = NULL;
    }
}

void PrintList(struct Student* student)
{
    struct Student* printStudent = student;
    printf("==========================\n");
    printf("Номер    Фамилия    Имя    Отчество    Пол    Год рождения    Курс    Группа    Оценка по Высшей математике    Оценка по Иностранному языку    Оценка по Украинскому языку    Оценка по программированию    Оценка по философии\n");
    printf("==========================\n");
    while (printStudent)
    {
        printf("%d    ", printStudent->id);
        printf("%-15s    ", printStudent->LastName);
        printf("%-15s    ", printStudent->FirstName);
        printf("%-15s    ", printStudent->Patronymic);
        printf("%s    ", printStudent->Gender);
        printf("%d    ", printStudent->Year_of_birth);
        printf("%d    ", printStudent->Course);
        printf("%-15s    ", printStudent->Group);
        printf("%d    ", printStudent->MathRating);
        printf("%d    ", printStudent->EnglishRating);
        printf("%d    ", printStudent->UkrainianRating);
        printf("%d    ", printStudent->ProgrammingRating);
        printf("%d    ", printStudent->PhilosophyRating);
        printf("\n");
        printStudent = printStudent->nextStudent;
    }
    printf("==========================\n");
}

void FreeList(struct Student** student)
{
    if (*student == NULL)
        return;
    struct Student* tmp = *student;
    struct Student* curr_stud;
    while (tmp)
    {
        curr_stud = tmp;
        tmp = tmp->nextStudent;
        free(curr_stud);
    }
    *student = NULL;
}

void ChangeStudentLastName(int n, char name[KOL], struct Student* students)
{
    struct Student* st = 0;
    for (st = students; st != NULL; st = st->nextStudent)
    {
        if (st->id == n)
        {
            strncpy(st->LastName, name, sizeof(st->LastName));
            st->LastName[sizeof(st->LastName) - 1] = '\0';
            printf("зміни записані\n");
            break;
        }
    }
}

int main(void)
{
    int command;
    struct Student* BaseStudent = NULL;
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    InitStudentList(&BaseStudent);
    for (;;)
    {
        printf("Введіть команду:\n1 - Виведення списку студентів,\n2 - Змінити прізвище зазначеного студента,\n3 - вихід\n");
        scanf("%d", &command);
        switch (command)
        {
        case 1:
            PrintList(BaseStudent);
            break;
        case 2:
        {
            int n;
            char name[KOL];
            printf("Введіть номер студента: ");
            scanf("%d", &n);
            printf("Введіть нове прізвище студента: ");
            scanf("%s", &name);
            ChangeStudentLastName(n, name, BaseStudent);
            break;
        }
        case 3:
            FreeList(&BaseStudent);
            return 0;
        default:
            printf("Помилка вводу...");
            FreeList(&BaseStudent);
            return 0;
        }
    }
    return 0;
}
  • Вопрос задан
  • 106 просмотров
Пригласить эксперта
Ответы на вопрос 1
Потому что пол у вас символ, а вы вводите строку.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы