实现自己的字符串拷贝函数Strcpy

strcpy是C语言的库函数,用于完成字符串的拷贝,很多笔试面试过程中要求我们自己实现这个函数。

字符串拷贝本身并没有太多技巧,可以利用最后的'\0'作为界限,用循环完成拷贝,代码如下

<pre name="code" class="cpp"><span style="font-size:18px;">char *Strcpy(char *strDst, const char *strSrc)
{
	//功能:实现字符串的拷贝
	//说明:要求两字符串内存区域 不可以 有重叠
	//	负责添加'\0'
	//	发生错误返回NULL
	
	//指针判空
	if(strDst==NULL || strSrc==NULL){
		return NULL;
	}

	//循环复制
	while((*strDst++ = *strSrc++) != '\0');

	return strDst;
}</span>
 
但如果只出这样的函数恐怕是不能得到工作的,因为这种复制函数有一个“坑”,这在函数说明中也提到了,那就是如果字符串内存有重叠复制就可能会失败(前往后复制会失败),而且可能不会出现任何异常!这种情况是程序设计过程中最恐怖的问题。所以便有了下面的改进版本 

<pre name="code" class="cpp"><span style="font-size:18px;">char *Strcpy(char *strDst, const char *strSrc)
{
	//功能:实现字符串的拷贝
	//说明:两字符串内存区域 可以 有重叠
	//	负责添加'\0'
	//	发生错误返回NULL
	//	指针判空
	if(strDst==NULL || strSrc==NULL){
		return NULL;
	}
	//复制到临时字符串
	int len = strlen(strSrc)+1;
	char *strTmp = new char[len];
	if(strTmp == NULL){
		return NULL;
	}
	char *pTmp = strTmp;//保存首地址
	while((*strTmp++ = *strSrc++) != '\0');
	//复制到目标字符串
	strTmp = pTmp;//恢复起点
	while((*strDst++ = *strTmp++) != '\0');
	delete[] pTmp;

	return strDst;
}</span>

 
解决方法也很直接,就是用一个临时字符串作为中间容器,以免发生错误的覆盖情况。 

其实内存复制函数memcpy()和memmove()的区别就是memcpy()没有考虑到内存重叠,而memmove()考虑到了。所以我们可以把我们的函数分别命名为Strcpy()和Strmove()。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值