Я знаю, что в Интернете есть много ответов, в которых говорится, что один лучше, чем другой, но я пришел к такому пониманию того, что strncpy()
лучше с точки зрения предотвращения ненужных сбоев в системе из-за отсутствия '\0'
. Как говорят многие, это довольно оборонительный подход.
Я уже переходил по этой ссылке: Почему вы должны использовать strncpy вместо strcpy ?
Скажем так:
char dest[5];
char src[7] = "Hello";
strncpy(dest, src, sizeof(dest)-1);
В этой реализации (ключ - sizeof(dest)-1
, который всегда дает место для добавления '\0'
), даже если в адресате есть усеченная строка, не всегда ли безопаснее использовать strncpy()
вместо strcpy()
? Другими словами, я пытаюсь понять, когда можно использовать strcpy()
вместо strncpy()
?
std::string
лучше. - person Captain Obvlious   schedule 19.04.2017strncpy
. - person Paul Ogilvie   schedule 19.04.2017strlcpy
- person Eugene Sh.   schedule 19.04.2017strncpy()
, и вместо этого возникает проблема, когда код используетdest
в качестве строки. - person chux - Reinstate Monica   schedule 19.04.2017strcpy
. Если вам удобнее читать за пределами конца массива, используйтеstrncpy
. Если вы хотите написать четко определенный код, используйтеstrncpy
и явно завершите нулевой буфер целевым буфером. - person IInspectable   schedule 20.04.2017std::strncpy
не зависит от размера целевого массива. Это зависит от того, сколько символов вы укажете для копирования, и если он достигнет этого предела до того, как увидит терминатор в исходном массиве, пункт назначения не получит терминатор.std::strncpy
не является безопасной заменойstd::strcpy
согласно любому разумному определению слова "безопасно". - person Pete Becker   schedule 20.04.2017strncpy
скопировать 4 символа, и посколькуstrncpy
не попадает в терминатор в исходной строке, он останавливается после четвертого символа без записи терминатора. Результатом копирования будет что-то вроде"Hell#(ALJLKJ"
, то есть в нем есть все случайные данные, находящиеся в памяти, начиная сdest[4]
, и любой код, использующийdest
, с большой вероятностью получит доступ к памяти с конца массива. Это не закончится хорошо. - person Pete Becker   schedule 20.04.2017