12

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()本质上更通用。任何原因?

4

3 回答 3

23

简单的区别是memcpy()可以复制带有嵌入空字符的数据(也称为 C 样式字符串中的字符串终止符),而strncpy()只会将字符串复制到给定字符数或第一个空字符位置的最大值(和填充其余为 0 的字符串)。

换句话说,它们确实有两个非常不同的用例。

于 2013-05-14T21:39:25.720 回答
5

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

 brr[2]={512,44};

第一个数字的最低有效字节brr[0]0( 512is 0x200),这将导致1) strncpy停止复制。strncpy不复制空字符后的字符。

1)要迂腐(见评论),只要实现有sizeof (int) > 1.

于 2013-05-14T21:40:56.190 回答
0

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

于 2014-09-30T09:23:33.067 回答