Если аргумент message
длиннее 20 символов, ваш первый цикл будет писать за пределами greeting
.Оператор if
не останавливает цикл, он продолжает идти, но назначает нулевые байты вместо argv[1][i]
.
И если аргумент message
вписывается в greeting
, вы никогда не добавите нольбайт вообще.Цикл останавливается после копирования последнего символа, не включая нулевого терминатора.
Вы можете просто использовать strncpy()
, а затем установить последний байт greeting
в нулевой байт.
strncpy(greeting, argv[1], sizeof greeting);
greeting[sizeof greeting - 1] = '\0';
Перед добавлением пробела необходимо проверить, достигли ли вы предела:
if (greeting_len < 18) {
greeting[greeting_len] = ' ';
greeting[greeting_len+1] = '\0';
greeting_len++;
}
if (greeting_len < 18) {
strncat(greeting, name, 19-greeting_len);
}
Но если вы можете использовать snprintf()
, все будет гораздо проще:
snprintf(greeting, sizeof greeting, "%s %s", argv[1], name);