Хорошо, strncpy
не предназначен для работы со строкой с завершением NULL - он не предназначен для строк с завершением NULL (если dest слишком короткий, он не будет завершен NULL, а если dest длиннее, он будет дополнен нулями).
Итак, вот тривиальный код:
const char *src = ....; // NULL terminated string of unknown length
char dest[30];
Как src до dest ?strcpy
небезопасен, strncpy
тоже плохой выбор.Итак, я ушел с strlen , а затем memcpy
?Я полагаю, что решение будет немного отличаться всякий раз, когда я забочусь, dest не будет усечено ( dest меньше, чем длина src ) или нет.
Некоторые ограничения:
- Устаревший код, поэтому я не хочу и не могу изменить его на std :: string
- У меня нет
strlcpy
- GCC не предоставляет его. - Код может использоваться в тех частях приложения, где производительность критична (например, я не хочу тратить время на CPU с нулями dest , как
strncpy
).Тем не менее, я не говорю о преждевременной оптимизации, а скорее о идиотском способе выполнения копирования строк C-way.
Edit
Упс, яозначало strncpy
, а не snprintf
.Моя ошибка