Некоторые люди, кажется, думают, что функция strcpy()
в C плохая или злая. Хотя я признаю, что обычно лучше использовать strncpy()
, чтобы избежать переполнения буфера, следующее (реализация функции strdup()
для тех, кому не повезло с ней) безопасно использует strcpy()
и никогда не должно переполняться:
char *strdup(const char *s1)
{
char *s2 = malloc(strlen(s1)+1);
if(s2 == NULL)
{
return NULL;
}
strcpy(s2, s1);
return s2;
}
*s2
гарантированно имеет достаточно места для хранения *s1
, а использование strcpy()
избавляет нас от необходимости сохранять результат strlen()
в другой функции для последующего использования в качестве ненужного (в данном случае) параметра длины для strncpy()
. Тем не менее, некоторые люди пишут эту функцию с strncpy()
или даже memcpy()
, которые оба требуют параметра длины. Я хотел бы знать, что люди думают об этом. Если вы считаете, что strcpy()
в определенных ситуациях безопасен, так и скажите. Если у вас есть веская причина не использовать strcpy()
в этой ситуации, укажите ее — мне хотелось бы знать, почему в подобных ситуациях лучше использовать strncpy()
или memcpy()
. Если вы думаете, что strcpy()
подходит, но не здесь, объясните.
По сути, я просто хочу знать, почему некоторые люди используют memcpy()
, когда другие используют strcpy()
, а третьи используют простое strncpy()
. Есть ли какая-то логика в том, чтобы предпочесть один из трех (без учета проверок буфера первых двух)?