Помните, что в строке C вам понадобится общая длина плюс еще один байт для символа NUL-терминатора .Это означает, что вам нужно:
char ccat[strlen(str1)+strlen(str2)+1];
Так как вы не выделяли достаточно места для последнего персонажа, вы получаете случайный мусор, например @
, или это может быть что угодно.Или ничего.
Во-вторых, вы запрещали strncpy
применять полную строку, включая терминатор NUL.Это привело к неполной записи.Правильное завершение необходимо, поэтому быстрое исправление - strlen(str1)+1
, но вы должны описать длину принимающего буфера , чтобы предотвратить переполнение, а не длину того, что вы пишете.
Вам также потребуется либо добавить терминатор NUL вручную, либо изменить способ добавления строк.Этот подход может быть лучше:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *str1 = "foo";
char *str2 = "bar";
char ccat[strlen(str1)+strlen(str2)+1];
// The length limit on the first one is the length of the buffer - 1
strncpy(ccat, str1, sizeof(ccat)-1);
// The length limit on the second is that minus the length of what's in there
strncat(ccat, str2, sizeof(ccat)-strlen(ccat)-1);
puts(str1);
puts(str2);
puts(ccat);
return 0;
}
Стоит отметить, что ваш компилятор может предупредить (-Wall
) о распространенных проблемах переполнения, если вы запутались, как в следующем примере:
the value of the size argument in 'strncat' is too large, might lead to a buffer overflow [-Wstrncat-size]