请写一个函数,实现类似的strcpy的字符串复制功能

来源:互联网 发布:校园网络平台建设计划 编辑:程序博客网 时间:2024/05/18 00:50

这个题目看起来很简单,但要完整的实现其功能还是得下的功夫
先来看下一个经典错误的程序

char *  mystrcpy(char *dest,char *src){char *ret;dest=(char *)malloc(strlen(src)+1);ret=dest;if(dest){while(*dest++=*src++);return ret;}elseprintf("error\n");}

通常情况下虽然能输出正确的答案,但是这个函数式有问题的。
这里主要错误是改变了dest指针,使其重新指向了一个从堆区分配的地址,函数结束时,堆区资源释放,是其分配的区域变得不可用。

接下来对这个函数进行改进
这里注意的几点如下:
1  dest src不能为空指针
2  函数内不能修改dest src指针
3  当dest 与 src 出现内存重叠式时该如何处理
char *  mystrcpy(char *dest,char *src){char *d=dest;char *s=src;int count=0;assert((dest!=NULL)&&(src!=NULL) );if(src==dest)return src;count=strlen(src)+1;if(count<=1)return 0;if((dest<src)|| dest >=(src+count)) //第一、二种情况{while(count--){*d++=*s++;}}else   //第三种情况{d+=count;s+=count;while(count--){*d--=*s--;}}return dest;}


上面程序是经过修改过的。
现在重点分析下内存区域重叠问题, 在嵌入式里,经常要操作地址值,所以出现内从重叠现象是经常发生的。
src dest指针分布情况有三种情况,如下图所示。

接下来重点看下第三种情况下的主函数代码

int _tmain(int argc, _TCHAR* argv[]){        char src1[20]="hello world";char *src2=(char *)(src1)+2;char *dest1=src2;dest1=mystrcpy(src2,src1);printf("%s\n",dest1);}

此时src1与src2在内存中的布局如上图所示,属于第三种情况。