Цитирование соответствующего тега [strncpy]
в переполнении стека { ссылка }, которое может помочь вам понять, что именно происходит:
Эту функцию не рекомендуется использовать ни для каких целей, ни в C, ни в C ++. Он никогда не задумывался как "безопасная версия strcpy
" , но его часто неправильно используют в таких целях. На самом деле он считается намного более опасным, чем strcpy
, поскольку нулевой механизм завершения strncpy
не является интуитивным и поэтому часто неправильно понимается. Это происходит из-за следующего поведения, определенного ISO 9899: 2011 7.24.2.4:
char *strncpy(char * restrict s1,
const char * restrict s2,
size_t n);
/ - /
3 Если массив указывает на s2 - это строка, которая короче n символов, нулевые символы добавляются к копии в массиве, указанном s1 , до тех пор, пока не будет записано n символов.
Очень распространенная ошибка - передать s2
, который является точно таким же количеством символов, что и параметр n
, и в этом случае s1
не завершится нулем. То есть: strncpy(dst, src, strlen(src));
/* MCVE of incorrect use of strncpy */
#include <string.h>
#include <stdio.h>
int main (void)
{
const char* STR = "hello";
char buf[] = "halt and catch fire";
strncpy(buf, STR, strlen(STR));
puts(buf); // prints "helloand catch fire"
return 0;
}
Рекомендуется в C заранее проверять размер буфера и затем использовать strcpy()
или memcpy()
. Рекомендуемая практика в C ++ - использовать std::string
.