您的位置:首页 > 其它

strcpy函数的实现

2014-04-04 11:21 239 查看
大家一般认为名不见经传strcpy函数实现不是很难,流行的strcpy函数写法是:

char *my_strcpy(char *dst,const char *src)
{
	assert(dst != NULL);
	assert(src != NULL);
	char *ret = dst;
	while((* dst++ = * src++) != '\0') 
		;
	return ret;
}
如果注意到:

1,检查指针有效性;

2,返回目的指针des;

3,源字符串的末尾 '\0' 需要拷贝。

写出上面实现函数就不在话下。

然而这样的实现没有考虑拷贝时内存重叠的情况,下面的测试用例就能使调用my_strcp函数的程序崩溃:

char str[10]="abc";
my_strcpy(str+1,str);


然而调用系统的strcpy函数程序正常运行,打印str结果为“aabc”!可见系统strcpy函数的实现不是这样的。

strcpy的正确实现应为:

char *my_strcpy(char *dst,const char *src)
{
	assert(dst != NULL);
	assert(src != NULL);
	char *ret = dst;
	memcpy(dst,src,strlen(src)+1);
	return ret;
}

memcpy函数实现时考虑到了内存重叠的情况,可以完成指定大小的内存拷贝,它的实现方式建议查看文章“卓越的教练是如何训练高手的?”,会获益良多,这里仅粘帖函数memcpy函数的实现:

void *memcpy(void* dst,const void* src,unsigned int count)
{
	assert(src!=NULL);
	assert(dst!=NULL);
	void *ret=dst;
	char *pdst=static_cast<char*>(dst);
	const char *psrc=static_cast<const char*>(src);

	if (dst>src&&pdst<psrc+count) //内存重叠
	{
		pdst=pdst+count-1;
		psrc=psrc+count-1;

		while (count--)
		{
			*pdst=*psrc;
			pdst=pdst-1;
			psrc=psrc-1;
		}

		
	} 
	else  //内存不重叠
	{
		while (count--)
		{
			*pdst=*psrc;
			pdst=pdst+1;
			psrc=psrc+1;
		}
	}

	return ret;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: