memcpy()和strncpy()有什么区别,因为后者很容易替代前者?

时间:2013-05-14 21:36:40

标签: c memcpy strncpy string.h

memcpy()strncpy()之间的显着差异是什么?我这样问是因为我们可以轻松地改变strncpy()来复制我们想要的任何类型的数据,而不仅仅是字符,只需将前两个非char*参数转换为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头文件中,因为几乎所有的库函数都与字符串相关,而{{1在本质上更通用。有什么原因吗?

3 个答案:

答案 0 :(得分:21)

简单的区别在于memcpy()可以复制带有嵌入空字符的数据(也就是C风格字符串中的字符串终结符),而strncpy()只能将字符串复制到最大值给定的字符或第一个空字符的位置(并用0填充其余字符串)。

换句话说,他们确实有两个截然不同的用例。

答案 1 :(得分:5)

以数组中的这些数字为例:

 brr[2]={512,44};

第一个数字brr[0]的最低有效字节为05120x200),这会导致 1) {{1停止复制。 strncpy不会复制null后面的字符 字符。

<子> 1)为了迂腐(见评论),如果实施具有strncpy,则保留。

答案 2 :(得分:0)

当需要复制内存块时,memcpy非常有用,并且字符串strncpy中的数据是有意义的,因为'\ 0'终止字符串的自然优势。否则两者在执行后都执行相同的复制模式。