2016-01-14 4 views
2

Я столкнулся с двумя популярными способами написать безопасную функцию копирования, которая является переносной и соответствует C89.Есть ли разница между strncat и strncpy для записи безопасной функции копирования строк?

Пример 1:

strncpy(dst, src, size); 
dst[size - 1] = '\0'; 

Пример 2:

dst[0] = '\0' 
strncat(dst, src, size - 1); 

Мои вопросы:

  1. Есть ли какие-либо технические различия между этими двумя?
  2. Есть ли какие-либо специальные сценарии, где один предпочтительнее другого?
+3

Определите «лучше» – Levi

+0

Они оба гарантированно ведут себя одинаково, поэтому они оба лучше. –

+1

Вы также можете попробовать snprintf, который даст вам немного более полезное возвращаемое значение, т. Е. Общее количество написанных символов. – bruceg

ответ

2

Да, они технически разные. Хотя вам может не нравиться тривиальная разница.

например. если вы инициализации, как это:

char dst[] = "abcdefg"; 
char src[] = "12"; 
size_t size = sizeof dst; 

Затем с "Пример 1", dst становится 0x31 0x32 0x00 0x00 0x00 0x00 0x00 0x00

С вашим "Пример 2", dst становится 0x31 0x32 0x00 0x64 0x65 0x66 0x67 0x00

Если вы хотите, чтобы скопировать строку , то разница не имеет значения.

Трудно сказать, какой из них лучше. Но в случае очень большого size и очень короткого src установка всех конечных нулевых символов с помощью подхода «Пример 1» может сделать программу немного медленнее.

+0

ITYM "null characters" ('NULL' - константа нулевого указателя) –

+0

@ M.M Я не знаю, что прописные буквы считаются плохими. Изменено в любом случае. – cshu