Ok, strncpy
не предназначен для работы с NULL завершаемыми строками - он не предназначен для строк с завершающим NULL (если dest слишком короткий, он не будет прерван NULL и если dest больше, он будет дополнен нулями).Назад к основам - идиоматический способ копирования строки в статический массив
Итак, вот тривиальный код:
const char *src = ....; // NULL terminated string of unknown length
char dest[30];
Как ЦСИ к Dest? strcpy
небезопасен, strncpy
- плохой выбор тоже. Итак, я оставил с strlen, а затем memcpy
? Я полагаю, что решение будет немного отличаться, когда мне будет нужно заботиться dest не будет усечен (dest меньше длины src) или нет.
Некоторые ограничения:
- код Legacy, так что я не хочу и не могу изменить его StD :: строка
- У меня нет
strlcpy
- НКУ не поставляет Это. - Код может использоваться в тех частях приложения, где критическая производительность (например, я не хочу откладывать время процессорного времени с нулями dest как
strncpy
). Тем не менее, я не говорю о преждевременной оптимизации, а скорее о идиотском способе выполнения строкового копирования на C-образном пути.
Редактировать
Oopps, я имел в виду strncpy
и не snprintf
. Моя ошибка
Положите `dest [29] = 0`, используйте snprintf с n = 29 и не беспокойтесь о заполнении. – sje397 2010-12-06 05:28:44
Почему «snprintf» - плохой выбор? – MAK 2010-12-06 05:29:01
Вы просто ошибаетесь в своих помещениях. `snprintf` ** всегда null завершает ** и ** никогда не прокладывает **. – 2010-12-06 06:01:30