В чем разница между 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'. В противном случае оба выполняют один и тот же шаблон копирования после выполнения.

Другие вопросы по тегам