面试题目整理:实现memcpy和strcpy,考虑内存重叠的问题

strcpy和memcpy的区别:
复制方法不同
复制的数据不同:strcpy只能复制字符串,因为判断到’0’则停止复制
而memcpy则全部都可以复制

code

#include <stdio.h>
void *MyMemCopy(void *dst,void *src,int size){
		asssert(to!=NULL && from!=NULL);
	//如果目标字符串在前面或者,原串的总长度小于分配给
	//目标字符串的位置
	//那么就不会发生重叠
	if(dst < src || src+size <= dst){
		char *d = dst;
		const char *s = src;
		while(size--){
			*d++ = *s++;
		}
	}else{//倒着复制
		char *d = dst + size -1;
		const char *s = src + size -1;
		while(size--){
			*d-- = *s--;
		}
	
	}
	d[size] = '\0';
	return d;
	
}
//要有返回的参数,为了实现链示表达式
char *MstrCpy(char *dst,const char *src){
	//如果输入不符合则提前终止
	//打印出错误
	//输入参数的合法性
	asssert(to!=NULL && from!=NULL);
	int size = strlen(dst) + 1 ;
	//如果目标字符串在前面或者,原串的总长度小于分配给
	//目标字符串的位置
	//那么就不会发生重叠
	if(dst < src || src+size <= dst){
		char *d = dst;
		const char *s = src;
		while(size--){
			*d++ = *s++;
		}
	}else{//倒着复制
		char *d = dst + size -1;
		const char *s = src + size -1;
		while(size--){
			*d-- = *s--;
		}
	
	}
	d[size] = '\0';
	return d;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值