Как получить полный поток ввода для моей программы? - PullRequest
0 голосов
/ 05 января 2020

У меня есть задача, которая мне нужна, чтобы ввести всю информацию о студентах (ID, имя, класс) в качестве базы данных в качестве исходного кода ниже. Мой исходный код здесь полностью действителен в отношении синтаксиса (не сообщается об ошибке, как делает мой g cc), но я не могу ввести оценки учеников. Когда я запускаю свою программу, она пропускает шаг ввода оценки учащегося и шаг ввода следующего идентификатора учащегося. Я поместил getchar() для удержания символа \n, но он может вообще не работать или есть другая причина этой ошибки.

typedef struct 
{
    char id[10];
    char name[50];
    float grade;
    char assess;
}student;
student std[50];
    do {
        printf("How many students you want to add?\n");
        scanf("%d", &num);
        if(num<0 || num>50)
            printf("Your number must be positive or smaller than or equal to 50!\n");
    } while(num<0||num>50);

    for(i = a; i < num; i++)
    {
        printf("Student's id No.%d:", i);
        fgets(std[i].id, MAX, stdin);
        getchar();
        printf("Student's name No.%d:", i);
        fgets(std[i].name, MAX, stdin);
        getchar();
        printf("Student's grade No.%d:", i);
        do {
            scanf("%f", std[i].grade);
            if(std[i].grade < 0 || std[i].grade > 10)
                printf("Please re-input grade, it must be between 0 and 10\n");
        } while(std[i].grade < 0 || std[i].grade > 10);
        std[i].assess=assess(std[i].grade);
    }

1 Ответ

1 голос
/ 05 января 2020

Чтобы записать данные в ячейку памяти, выделенную для переменных, вам нужно указать адрес переменной, вы используете scanf on. Поэтому scanf("%f", std[i].grade); следует изменить на scanf("%f", &(std[i].grade) );.

. По вышеупомянутой причине ваш код имеет неопределенное поведение, которое часто, но не всегда, приводит к ошибке сегментации.

...