Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2020, 16:01   #1
jonikster
Форумчанин
 
Регистрация: 28.10.2014
Сообщений: 216
По умолчанию Проблемы с 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;
}
jonikster вне форума Ответить с цитированием
Старый 28.05.2020, 19:09   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Видимо, scanf даёт после ввода строки заключительный нулевой байт, поэтому Gender тоже д.быть массивом char[2], или же вводить через getch.
Как работает функция getchar? - C (СИ) - строка поиска. Непосредственно URL дать не могу - не приветствуется ссылка на конкурентов.
Вот так попробовать можно решение полового вопроса
Какая-то странная прога получается - двуязычная Шутить по этому поводу не стану, чтоб не получить очередной "горчичник".
Код:
    for (;;)
- а такая конструкция будет работать ? Ни разу не встречал.

Последний раз редактировалось digitalis; 28.05.2020 в 19:17.
digitalis вне форума Ответить с цитированием
Старый 29.05.2020, 08:51   #3
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
а такая конструкция будет работать
будет, причём со свистом ))

аналог
while(1)
Алексей1153 вне форума Ответить с цитированием
Старый 29.05.2020, 11:01   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Thanks
"Воспользуюсь "© из фильма
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с вводом переменных Niven Общие вопросы C/C++ 7 24.03.2016 19:16
Проблемы с ручным вводом(Delphi)?! Npwas Помощь студентам 9 19.02.2012 20:39
С++ задача на массив натуральных дробей. Проблемы с вводом. Лоботряс Помощь студентам 2 13.01.2011 01:32
Строки;( Проблемы с вводом. Aerial Общие вопросы C/C++ 0 20.04.2010 21:00
Проблемы системы ввода/вывода C (stdio.h, printf(), scanf()...) vladislavchick Помощь студентам 2 21.02.2010 13:30