自定义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肯定也在同步生长,导致遍历不到结尾了),就出错了!
相关文章推荐
- Android平台和java平台 DES、3DES、RSA加密解密互通程序及其不能互通的原因
- C语言 编写程序实现内存拷贝,不考虑内存重叠。不允许调用memcpy函数
- 【代码】Android和java平台 DES加密解密互通程序及其不能互通的原因
- 内存不能为READ的原因
- des 填充信息的保护,正确加密与解密,中文签名错误异常原因
- 系统提示“该内存不能为read”的原因及解决方法
- 引起内存不能“read”的原因及“written”的解决方案
- “0x????????”指令引用的“0x????????”内存。该内存不能为“read”。原因及解决办法
- C语言 编写函数实现内存重叠拷贝,不允许调用memmove函数
- 2440偶尔不能启动的原因——难道真的必须在bootloader阶段清零内存吗?
- C语言:内存重叠
- TOMCAT不能连接SQL SERVER 2008 R2,不能创建JDBC连接之原因解密!
- 【C语言】模拟实现memmove函数(考虑内存重叠)
- 系统出现内存不能为"Read"或"written"的原因
- Android平台和java平台 DES加密解密互通程序及其不能互通的原因
- 内存提示不能为读或写的原因
- Android和java平台 DES加密解密互通程序及其不能互通的原因
- IIS自定义404错误不能生效的原因
- GHOST后内存不能读写的解决方法和原因
- C语言实现数据保护算法(1)——DES&3DES加解密