字符串拷贝操作函数原型实现

18 篇文章 0 订阅

字符串拷贝函数

char * strcpy(char *dst,const char *src)     
{  
    if((dst==NULL)||(src==NULL))  
         return NULL;   
    char *ret = dst; //[1]  
    while ((*dst++=*src++)!='\0'); //[2]  
    return ret;//[3]  
}

 

(1)const 修饰:源字符串参数用const修饰,防止修改源字符串;
(2)空指针检查:源指针和目的指针都有可能会出现空指针的情况,所以应该对其进行检查;
(3)为什么要设置ret 指针以及返回ret指针的位置[3],由于目的指针dst已经在进行移动了,所以用辅助指针ret表明首指针;

 

(4)以上所示[2]处,为简单的字符串的复制过程,正好表明strcpy函数遇到'\0'将会停止;

内存拷贝函数

 
void *memcpy( void *dest, const void *src, size_t count );
void *memmove( void* dest, const void* src, size_t count )
void* memcpy(void* dst, const void* src, size_t n)//(不考虑内存重叠版本) 
{ 
	if (!dst || !src || n < 0) 
	{ 
		return NULL; 
	}
	void* temp = dst; 
	while (n--) 
	{ 
		*(char*)dst = *(char*)src; 
		dst = (char*)dst + 1; 
		src = (char*)src + 1; 
	}
	return temp; 
}
void *memcpy(void *dest, const void *src, size_t count)//(考虑内存重叠版本)
{
	void * ret = dst;
	if (dst <= src || (char *)dst >= ((char *)src + count)) {// 若dst和src区域没有重叠,则从起始处开始逐一拷贝
		while (count--)
		{
			*(char *)dst = *(char *)src;
			dst = (char *)dst + 1;
			src = (char *)src + 1;
		}
	}
	else { // 若dst和src 区域交叉,则从尾部开始向起始位置拷贝,这样可以避免数据冲突
		dst = (char *)dst + count - 1;
		src = (char *)src + count - 1;

		while (count--) {
			*(char *)dst = *(char *)src;
			dst = (char *)dst - 1;
			src = (char *)src - 1;
		}
	}
	return(ret);
}
void *  memmove(void* dst, const void* src, size_t count)
{
	void * ret = dst;
	if (dst <= src || (char *)dst >= ((char *)src + count)) {
		// 若dst和src区域没有重叠,则从起始处开始逐一拷贝
		while (count--) {
			*(char *)dst = *(char *)src;
			dst = (char *)dst + 1;
			src = (char *)src + 1;
		}
	}
	else {
		// 若dst和src 区域交叉,则从尾部开始向起始位置拷贝,这样可以避免数据冲突
		dst = (char *)dst + count - 1;
		src = (char *)src + count - 1;

		while (count--) {
			*(char *)dst = *(char *)src;
			dst = (char *)dst - 1;
			src = (char *)src - 1;
		}
	}

	return(ret);
}

 

1.memcpy和memmove相同点

 

都是用于从src拷贝count个字节到dest。

2.memcpy和memmove区别
如果目标区域和源区域有重叠的话:
memcpy不能够确保源串所在重叠区域在拷贝之前被覆盖。
memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后src内容会被更改,当目标区域与源区域没有重叠则和memcpy函数功能相同。

但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。
memmove的处理措施:
(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝
(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝

从代码可以看出来考虑内存重叠的memcpy版本其实就是memmove函数原型

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值