您的位置:首页 > 编程语言 > C语言/C++

自定义strcat之MyStrcat,解密src与des内存不能重叠原因(C语言之stract函数)

2013-12-22 12:13 375 查看
#include<iostream>
#include<string>
#include<cassert>
using namespace std;

////////////////////////////////////
char* MyStrcat(char* src,char* des)
{
assert(src!=NULL && des!=NULL);
int srcEnd = 0;
while(1)
{
if(src[srcEnd] != '\0')
srcEnd++;
else
break;
}
char* pdes = des;
while(1)
{
if(*pdes != '\0')
{
src[srcEnd] = *pdes;
srcEnd++;
pdes++;
}
else
{
src[srcEnd] = '\0';
break;
}
}
return src;
}

////////////////////////////////////
bool IsSubstring(char* src,char* des)
{
char* srcTemp = new char[strlen(src)+1];
strcpy(srcTemp,src);
srcTemp[strlen(src)] = '\0';
src = MyStrcat(src,srcTemp);
if(strstr(src,des) != NULL)
{
delete[] srcTemp;
return true;
}
else
{
delete[] srcTemp;
return false;
}
}

void main()
{
char src[20] = "abcdef";
char des[20] = "bcdg";
if(IsSubstring(src,des))
cout<<"OK"<<endl;
else
cout<<"NO"<<endl;

strcpy(src, "abcdef");
strcpy(des,"bc");

if(IsSubstring(src,des))
cout<<"OK"<<endl;
else
cout<<"NO"<<endl;
}

/*
NO
OK
*/

总结:内存重叠,也就是指对于strcat函数,它的两个参数src和des指向了同一块内存,这对于strcat来说,会造成错误。造成错误的原因是因为src在一直增长着(因为要将des遍历一遍赋值给src,但是des和src指向同一块内存,由于赋值的过程中src一直在生长,那么des肯定也在同步生长,导致遍历不到结尾了),就出错了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: