В вашем коде вы сначала объединяете surname
в конце space
с strcat(space, surname)
, которое имеет неопределенное поведение, поскольку space
имеет только 2 элемента, пробел и нулевой терминатор. Копирование surname
в конце повреждает массив name
, который вы видите, поскольку name
становится ossi
. Это поведение undefined, это происходит в вашей архитектуре, но поведение undefined может иметь другие последствия, включая отсутствие видимого эффекта или компьютерный треск sh.
Также обратите внимание на эти примечания:
- вы должны указать
scanf()
максимальное количество символов для хранения в name
и surname
, чтобы избежать неопределенного поведения при слишком длинном вводе. - вы должны передать
name
вместо &name
. - вы должны проверить возвращаемое значение
scanf()
, чтобы избежать неопределенного поведения при недопустимом вводе, например, в случае неожиданного конца файла или пустой строки для первого scanf()
. - вы можете определить массивы с размерами, которые определяют поведение всегда.
Для более чистого подхода вы должны использовать 2 разных массива firstname
и surname
для пользовательского ввода и построить имя в третий массив name
, достаточно большой для всех случаев:
strcpy(name, firstname);
strcat(name, " ");
strcat(name, surname);
или менее читаемый:
strcat(strcat(strcpy(name, firstname), " "), surname);
Оба вышеперечисленных элемента будут без нужды перебирать символ актеры уже скопированы в name
. Более чистым и безопасным решением является использование snprinf()
:
snprintf(name, sizeof name, "%s %s", firstname, surname);
Вот модифицированная версия:
#include <stdio.h>
#include <string.h>
int main() {
char firstname[40]; /* up to 39 characters for the first name */
char surname[40]; /* up to 39 characters for the last name */
char name[80]; /* 39 chars + 1 space + 39 chars + 1 null terminator */
printf("What is your name: ");
if (scanf(" %39[^\n]", name) != 1)
return 1;
printf("What is your surname: ");
if (scanf(" %39[^\n]", surname) != 1)
return 1;
/* simpler solution with `snprintf` */
snprintf(name, sizeof name, "%s %s", firstname, surname);
printf("%s\n", name);
return 0;
}