【19】实现strcpy和memcpy函数


一. strcpy函数

1. strcpy的原型是char* strcpy(char *des, const char *src); 返回des指针。

    作用是把src指针指向的字符串复制到des指针指向的字符串中。

2. des所指向的内存空间要足够大保证能够容纳src所指的字符串,strcpy函数碰到第一个\0字符的时候结束复制

3. strcpy函数的实现,考虑内存重叠

//strcpy函数实现
char* strcpy(char *des, const char *src){
	//空指针报异常
	if(des == NULL || src == NULL){
	    throw exception("error");
		return NULL;
	}
	//如果是自己复制自己直接返回
	if(des == src){
	    return des;
	}
    //求出stc指向的字符串长度
	int length = strlen(src);
	//考虑内存重叠
	if((des > src) && (des < src+length)){
		//从后往前复制
		for(int i = length-1; i >= 0; i--){
		    des[i] = src[i];
		}
	}
	else{
	    //从前往后复制
		for(int i = 0; i < length; i++){
		    des[i] = src[i];
		}
	}
	//最后一位赋值为\0
	des[length] = '\0';
	return des;
}

二. memcpy函数

1. memcpy是C语言中的内存复制函数,它的函数原型是 void* memcpy(void *des, const void *src, size_t count),返回des指针变量。

    作用是把src指向的内存地址空间中的count个字节复制到des指向的内存空间。

2. des和src所指向的内存空间是不能重叠的,memcpy可以复制任何数据类型,并且必须复制count个字节。

3. memcpy函数的实现,考虑内存重叠

void* memcpy(void *des, const void *src, size_t count){
	//如果是空指针抛异常
	if(des == NULL || src == NULL){
	    throw exception("error");
	    return NULL;
	}
	//如果自己复制自己直接返回
	if(des == src){
	    return des;
	}
	//转化为字符指针类型
	char *tmpDes = (char*)des;
	char *tmpSrc = (char*)src;
	//考虑内存重叠
	if((tmpDes > tmpSrc) && (tmpDes < (tmpSrc+count))){
	    //从后往前复制
		for(size_t i = count-1; i >= 0; i--){ //注意i是size_t类型
		    tmpDes[i] = tmpSrc[i];
		}
	}
	else{
		//从前往后复制
		for(size_t i = 0; i < count; i++){ //注意i是size_t类型
		    tmpDes[i] = tmpSrc[i];
		}
	}
	return des;
}


三. strcpy和memcpy的区别

1. strcpy是用来复制字符串的,memcpy是用来复制一段内存的

2. strcpy复制字符串的时候遇到\0就结束,memcpy必须复制指定大小的内存才结束



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
memcpystrcpy有以下几个区别: 1. 复制的内容不同:strcpy只能复制字符串,而memcpy可以复制任意内容,包括字符数组、整型、结构体、类等。\[2\] 2. 复制的方法不同:strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,如果空间不够,就会引起内存溢出。而memcpy则是根据其第三个参数决定复制的长度,可以精确控制复制的字节数。\[2\] 3. 用途不同:通常在复制字符串时使用strcpy,而需要复制其他类型的数据时则一般使用memcpy。由于字符串是以"\0"结尾的,所以对于在数据中包含"\0"的数据只能使用memcpy。\[2\] 此外,从效率上来看,根据源码分析,可以发现在拷贝相同字符串的情况下,memcpy函数中有3个变量在变化,而strcpy只有两个变量变化,因此可以认为strcpy的效率更高。\[3\] #### 引用[.reference_title] - *1* *3* [memcpystrcpy区别以及它们的效率分析](https://blog.csdn.net/vgxpm/article/details/47614901)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [strcpymemcpy的区别](https://blog.csdn.net/jiaoty19/article/details/125169454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值