strncpy
не предназначен для использования в качестве более безопасного strcpy
, он должен использоваться для вставки одной строки в середину другой.
Все эти «безопасные» функции обработки строк, такие как snprintf
и vsnprintf
, являются исправлениями, которые были добавлены в более поздние стандарты для уменьшения эксплойтов переполнения буфера и т. Д.
Википедия упоминает strncat
как альтернативу написанию собственного сейфа strncpy
:
*dst = '\0'; strncat(dst, src, LEN);
EDIT
Я пропустил, что strncat превышает символы LEN при нулевом завершении строки, если оно длиннее или равно символам LEN.
В любом случае, смысл использования strncat вместо любого собственного решения, такого как memcpy (..., strlen (...)) / независимо от того, что реализация strncat может быть оптимизирована для целевой платформы или платформы в библиотеке.
Конечно, вам нужно проверить, что dst содержит хотя бы nullchar, поэтому правильное использование strncat будет выглядеть примерно так:
if(LEN) { *dst = '\0'; strncat(dst, src, LEN-1); }
Я также допускаю, что strncpy не очень полезен для копирования подстроки в другую строку. Если src короче n символов, строка назначения будет усечена.