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()
在本质上更通用。任何理由吗?
简单的区别是memcpy()
可以复制带有嵌入空字符的数据(也就是c风格字符串中的字符串终止符),而strncpy()
只会将字符串复制到给定的字符数或第一个空字符的位置的最大值(并用0填充其余的字符串)。
换句话说,它们确实有两个非常不同的用例。
以数组中的这些数字为例:
brr[2]={512,44};
第一个数字brr[0]
的最低有效字节是0
(512
是0x200
),这将导致1) strncpy
停止复制。strncpy
不复制null后面的字符性格。
<子>1)迂腐地说(见注释),只要实现有sizeof (int) > 1
,这一点就成立。 子>
当内存块需要复制时,memcpy是有用的,字符串strncpy的for中的数据是有意义的,因为' '终止字符串的自然优势。否则在执行后执行相同的复制模式。