您的位置:首页 > 其它

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

2016-05-13 08:39 253 查看
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()。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: