В чем разница между memcpy() и strncpy(), учитывая, что последний может легко заменить первый?
В чем разница между memcpy()
а также strncpy()
? Я спрашиваю это, потому что мы можем легко изменить strncpy()
скопировать любой тип данных, который мы хотим, а не только символы, просто приведя первые дваchar*
аргументы char*
и изменение третьего аргумента, кратного размеру этого не-символьного типа. В следующей программе я успешно использовал это для копирования части целочисленного массива в другую, и это работает так же хорошо, как memcpy()
,
#include <stdio.h>
#include <string.h>
int main ()
{
int arr[2]={20,30},brr[2]={33,44};
//memcpy(arr,brr,sizeof(int)*1);
strncpy((char*)arr,(char*)brr,sizeof(int)*1);
printf("%d,%d",arr[0],arr[1]);
}
Точно так же мы можем заставить его работать на float
или другой тип данных. Так в чем же отличие от memcpy()
?
PS: интересно, почему memcpy()
в string.h
заголовочный файл, учитывая, что почти все функции библиотеки там связаны со строками символов, в то время как memcpy()
носит более общий характер. Какой-либо причине?
3 ответа
Простая разница в том, что memcpy()
может копировать данные со встроенными нулевыми символами (так называемый терминатор строки в строках в стиле C), тогда как strncpy()
будет копировать только строку с максимальным количеством заданных символов или положением первого нулевого символа (и дополнит оставшиеся строки нулями).
Другими словами, у них есть два очень разных варианта использования.
Возьмем для примера эти числа в вашем массиве:
brr[2]={512,44};
Младший значащий байт первого числа brr[0]
является 0
(512
является 0x200
) которая бы вызывала 1) strncpy
прекратить копирование. strncpy
не копирует символы, следующие за нулевым символом.
1) Чтобы быть педантичным (см. Комментарии), это выполняется при условии, что реализация имеет sizeof (int) > 1
,
Когда блок памяти требует копирования, полезно использовать memcpy и данные в строке for strncpy имеют смысл из-за естественного преимущества завершающей строки '\0'. В противном случае оба выполняют один и тот же шаблон копирования после выполнения.