C сканирование входных строк сохраняет в неправильную переменную - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь отсканировать 3 строки на консоли в C с помощью scanf, но каждый раз, когда вторая строка сканируется, она также будет добавляться в конце первой.

Я уже пытался изменить параметр формата scanf (%8s, %[^\n]s, %8[^\n]s), но ничего не получалось. Кажется, что %8s игнорирует второе scanf и переходит непосредственно к третьему.

char matrikelnumber[S_MATRIKELNUMBER]; //S_MATRIKELNUMBER is 8
char first_name[S_FIRST_NAME]; //S_FIRST_NAME is 30
char last_name[S_LAST_NAME]; //S_LAST_NAME is 30

printf("Matrikelnummer: ");
scanf("%s", matrikelnumber);

printf("%s\n", matrikelnumber); //Prints the correct input

printf("Vorname: ");
scanf("%s", first_name);

printf("%s\n", matrikelnumber); //Prints matrikelnumber + first_name added at the end

printf("Nachname: ");
scanf("%s", last_name);

Если я наберу 12345678 для matrikelnumber и Name для last_name, первый printf напечатает правильную строку, а второй напечатает 12345678Name.

Как правильно сохранить все 3 строки в соответствующей переменной?

1 Ответ

0 голосов
/ 10 января 2019

В C строки заканчиваются символом \0. Если ваш matrikelnumber должен иметь длину 8 цифр, вам нужно 9 символов для его хранения: 8 для его содержимого, плюс 1 для окончания \0.

Просто измените эту строку:

char matrikelnumber[S_MATRIKELNUMBER + 1]; //S_MATRIKELNUMBER is 8

Причина, по которой это происходит:

printf("%s\n", matrikelnumber); //Prints matrikelnumber + first_name added at the end

означает, что матричный номер читается и сохраняется, занимая 8 + 1 символов, а \0 в конце сохраняется после конца этого массива, который совпадает с местоположением

char first_name[S_FIRST_NAME]; //S_FIRST_NAME is 30

Затем вы читаете имя, которое хранится в этом месте, и его первый символ перезаписывает \0, который был там ранее сохранен. Итак, когда вы сейчас печатаете matrikelnumber, printf продолжает выводить, пока не найдет \0: тот, который ранее отмечал конец matrikelnumber, был удален, а first_name - сразу после, и эта строка действительно имеет \0 в конце.

...