Проблема с получением пользовательского ввода для структуры - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь получить ввод от пользователя для строк в структуре. Однако при попытке получить входные данные с использованием scanf, очевидно, две строки сохраняются в первом символьном массиве структуры. Ввод для строк дается через пробел. Вот почему я пытаюсь сделать это с помощью scanf, поскольку я не знаю, возможно ли получить ввод, разделенный пробелами, используя fgets.

Я также пытался изменить члены структуры на указатели на символьные массивы и выделить память для строк с помощью malloc, но после ввода продолжал выдавать ошибку seg.

#define MAXID 6
#define FIRST_NAME_LENGTH  20
#define LAST_NAME_LENGTH   20

struct student
{
    char ID[MAXID];
    char f_name[FIRST_NAME_LENGTH];
    char s_name[LAST_NAME_LENGTH];
    int points[MAXROUNDS];
};

struct student studentinfo;

.......

void student_info(struct student *studentinfo)
{
    printf("Give the students ID, surname and firstname.\n");
    scanf("%s%s%s", studentinfo->ID, studentinfo->s_name, studentinfo->f_name);
}

printf("Info of the last student added: %s %s %s\n", studentinfo.ID, studentinfo.s_name, studentinfo.f_name);

Таким образом, при вводе «666666 boi bobby» выдается «666666bobby boi bobby». Что делать?

1 Ответ

2 голосов
/ 20 апреля 2019

ID размер, если 6, но вы вводите для него 6 символов, нет места для нулевого конечного символа, который был сохранен в первый символ f_name до того, как он будет удален с помощью 'b' из Бобби , поэтому, когда вы печатаете ID, в нем нет нулевого символа, поэтому печать продолжает записывать содержимое f_name, создающего 666666bobby , тогда s_name это печать, производящая boi затем f_name печатается (снова), производя Бобби

Введите 66666 вместо 666666 или увеличьте размер ID , и это поведение исчезнет

Именно поэтому необходимо использовать защиту, чтобы избежать переполнения при чтении строки с scanf

...