strncpy
- это никогда правильный ответ, когда строка назначения заканчивается на ноль.strncpy
- это функция, предназначенная для использования с незавершенными фиксированной шириной строками.Точнее, его целью является преобразование строки с нулевым символом в конце в строку без фиксированной ширины (путем копирования).Другими словами, strncpy
здесь не имеет смысла.
Здесь у вас есть реальный выбор между strlcpy
и простым strcpy
.
Когда вы хотите выполнить «безопасно»(то есть потенциально усеченное) копирование в dst_arr
, правильная функция для использования - strlcpy
.
Что касается dst_ptr
... Нет такого понятия, как «копировать в dst_ptr
».Вы можете скопировать в память , указанную dst_ptr
, но сначала вы должны убедиться, что она куда-то указывает и выделить эту память.Есть много разных способов сделать это.
Например, вы можете просто сделать dst_ptr
, чтобы указать на dst_arr
, и в этом случае ответ будет таким же, как в предыдущем случае - strlcpy
.
Или вы можетевыделите память, используя malloc
.Если объем выделенной памяти гарантированно будет достаточным для строки (т. Е. Выделено не менее strlen(src_str) + 1
байт), то вы можете использовать обычный strcpy
или даже memcpy
для копирования строки.В этом случае нет необходимости и нет причин использовать strlcpy
, хотя некоторые люди могут предпочесть его, поскольку это как-то дает им ощущение дополнительной безопасности.
Если вы намеренно выделяете меньше памяти (т.е. вы хотитеваша строка будет усечена), тогда strlcpy
станет правильной функцией для использования.