В чем разница между memcpy () и strncpy (), учитывая, что последний может легко заменить первый?

В чем разница междуmemcpy() а такжеstrncpy()? Я спрашиваю это, потому что мы можем легко изменитьstrncpy() скопировать любой тип данных, который мы хотим, а не только символы, просто приведя первые дваchar* аргументыchar* и изменение третьего аргумента, кратного размеру этого не-символьного типа. В следующей программе я успешно использовал это для копирования части целочисленного массива в другую, и она работает так же хорошо, как и.memcpy()

 #include 
    #include 


    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() носит более общий характер. Какой-либо причине?

 Dukeling14 мая 2013 г., 23:40
 Thokchom14 мая 2013 г., 23:37
Я нагуглил за это, но единственный вопрос, который похож на этоstackoverflow.com/questions/4593907/... , но это не такне ответить на то, что я собираюсь спросить здесь.
 Marc B14 мая 2013 г., 23:39
Memcopy безоговорочно копирует досделано столько байтов, сколько вы хотели. strncpy будет копировать, пока не достигнет нулевого значения (терминатор строки), илиn байты скопированы. как таковой, вы не можете использовать strncpy для произвольных двоичных данных, потому что такие данные обычно могут содержать нули.
 Thokchom14 мая 2013 г., 23:42
Рад, что на этот раз я получил хорошие ответы, а не шквал голосов, как мой предыдущий вопрос !!

Ответы на вопрос(3)

полезно использовать memcpy и данные в строке for strncpy имеют смысл ввиду естественного преимущества '\ 0' завершенная строка. В противном случае оба выполняют один и тот же шаблон копирования после выполнения.

Возьмем для примера эти числа в вашем массиве:

 brr[2]={512,44};

Младший значащий байт первого числаbrr[0] является (0512 является0x200) что будет причиной1) strncpy прекратить копирование.strncpy не копирует символы, следующие за нулевым символом.

1) Чтобы быть педантичным (см. Комментарии), это выполняется при условии, что реализация имеет.sizeof (int) > 1

 ouah14 мая 2013 г., 23:53
@KerrekSB Какая часть ответа зависит от платформы?
 ouah14 мая 2013 г., 23:44
Так же. Нулевой символ (хотя расположен в другом месте) остановитstrncpy копия.
 Kerrek SB14 мая 2013 г., 23:54
@ouah: Да, но не два байта!
 Kerrek SB14 мая 2013 г., 23:55
@Thokchom: байт имеетCHAR_BIT биты.
 Thokchom14 мая 2013 г., 23:51
@KerrekSB Керрек, почему бы и нет?ты пролил свет на это?
 ouah15 мая 2013 г., 00:03
@KerrekSB, поэтому я добавил правку для решения этой проблемы.
 Thokchom14 мая 2013 г., 23:50
@KerrekSB Когда человек вашей репутацииспрашивает вопрос, можно считать это сарказмом ..... но потомouah рыбки тоже нет ...
 Kerrek SB14 мая 2013 г., 23:42
Что, еслиint 16-битный и хранится в порядке с прямым порядком байтов?
 Thokchom14 мая 2013 г., 23:53
@KerrekSB Shouldn 't endianess не является проблемой, когда мы копируем побайтно?
 ouah14 мая 2013 г., 23:54
@KerrekSB ноint гарантированно будет как минимум16 биты.
 Thokchom15 мая 2013 г., 00:00
@KerrekSB Пожалуйста, Керрек, последнее, пожалуйста, подтвердите это, заполнение выполняется NULL-символами, а? Не с нулевым символом, верно?
 Thokchom14 мая 2013 г., 23:51
@ouah, я все еще думаю, если твой ответ и Kerrek 'с вопросом совпадения.
 Thokchom15 мая 2013 г., 00:03
@KerrekSB Удивительный источник, сайт Службы национальной безопасности, говорит, что он дополняется значениями NULL.buildsecurityin.us-cert.gov/bsi-rules/home/g1/854-BSI.html  Кстати, какое отношение имеет эта служба к национальной безопасности?
 Thokchom14 мая 2013 г., 23:57
@KerrekSB Заполнение в случае, когда вторая строка меньше чем NUM вstrncpy.Я проверил его, и кажется, что он дополняется символами NULL до тех пор, пока не будет выполнено условие NUM.
 Kerrek SB14 мая 2013 г., 23:59
@Thokchom: Извинения, я не имелТ действительно намеревался заняться этим вопросом. Я просто думал, что этот ответ был немного сомнительным. (Не пытаясь в любом случае унизить OUA 'с отличным вкладом!)
 Kerrek SB14 мая 2013 г., 23:54
@ouah: утверждение, что естьноль. Если длина байта составляет 10 или 32 бита, тоэто не одно ... 32-битные длинные байты не являются неслыханными.
 Kerrek SB14 мая 2013 г., 23:52
@Thokchom: Какое это имеет отношение к чему-либо? Я просто хотел уточнить, что ноль неt обязательно в начале последовательности байтов. Кроме того, ноль предполагает, что байты имеют восемь битов (но с восьмибитными байтами действительно будетнемного где-то нулевой байт, как справедливо указывает Оах). В общем, это несколько зависимый от платформы ответ.
 Thokchom14 мая 2013 г., 23:56
@KerrekSB Я не знаюЯ не хочу обновлять его в вопросе и удлинять, так что вы можете сказать мне это - заполнение выполняется с помощью цифры 0 или символа '0'?
 ouah14 мая 2013 г., 23:55
@KerrekSB достаточно честно;)
Решение Вопроса

memcpy() может копировать данные со встроенными нулевыми символами (так называемый терминатор строки в строках в стиле C), тогда какstrncpy() будет только скопировать строку с максимальным количеством заданных символов или положением первого нулевого символа (и дополнит остальные строки 0).

Другими словами, у них есть два очень разных варианта использования.

 Timo Geusch15 мая 2013 г., 01:38
По этой ссылке (cplusplus.com/reference/cstring/strncpy), Это'с нулями.
 Thokchom14 мая 2013 г., 23:48
Отступы с 0 или 0? Я имею в виду NULL или символ '0'?
 nebain15 мая 2013 г., 02:58
Символ 0 (как в 0x0, а не '0') является нулевым символом.strncpy() пэды с символом 0 (т.е. нулевые символы).
 Thokchom15 мая 2013 г., 06:31
@nebain Вы правы только во второй части. Символ 0 НЕ является нулевым символом, числовой ноль -.

Ваш ответ на вопрос