В 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
в конце.