strcpy与strncpy和memcpy的不同

文章详细对比了C库中的strcpy、strncpy和memcpy三个函数,它们分别用于字符串复制和一般内存复制。strcpy在复制字符串时不检查长度,可能引发溢出问题,而strncpy允许指定长度但可能导致未填充NULL结束符。memcpy则更为通用,可用于任何类型数据的复制,但同样需要注意溢出风险。这三个函数在不同场景下各有适用。
摘要由CSDN通过智能技术生成

首先strcpy、strncpy和memcpy都是标准C库函数

strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。

strncpy在strcpy的基础上提供了控制想要复制字符串长度,但是strncpy追加结束标记'\0'。

memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。

strcpy代码:

char* strcpy(char* dest, const char* src)//返回类型char*
{
	assert(dest && src);//判断参数的有效性
	char* ret = dest;//保存需要返回数组的首地址
	while (*dest++ = *src++)//将src内容复制到dest
	{
		;
	}
	return ret;//返回dest地址
}

strncpy代码:

char* strncpy(char* dest, const char* src,size_t size)//返回类型char*  
{
	assert(dest && src);//判断参数的有效性
	char* ret = dest;//保存需要返回数组的首地址
	while (size--)//将src前size个字节的内容复制到dest
	{
		*dest++ = *src++;
	}
	return ret;//返回dest地址
}

memcpy代码:

void* memcpy(void* dest, void* src, size_t size)//返回类型void*,传入的两个值类型也看做void*,使得它可以拷贝其他类型  
{
	assert(dest && src);//判断参数的有效性
	void* ret = dest;//保存需要返回数组的首地址,返回类型void*
	while (size--)//将src前size个字节的内容复制到dest
	{
		*(char*)dest = *(char*)src;//强制转换成char*类型,因为char*类型的数据刚好一个字节
		dest = (char*)dest + 1;//因为是void*类型,无法直接进行加减操作
		src = (char*)src + 1;
	}
	return ret;//返回dest地址
}

总结:

1. 复制的内容不同。strcpy和strncpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2. 复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy和strncpy则是根据其第3个参数决定复制的长度。

3. 用途不同。通常在复制字符串时用strcpy和strncpy,而需要复制其他类型数据时则一般用memcpy。
 

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值