1.当我们想对一个字符串实现自我复制时使用strcpy函数会发现出现出入。
按理来说字符串应该更改为hhello。
2.重写strcpy
char * mycpy(char *dst, const char * src){
assert(dst != NULL);
assert(src != NULL);
char *ret = dst;
while((*dst++ = *src++) != '\0');
return ret; //支持链式表达式 如strlen(mycpy(dst,src));
}
此时看起来比较完整了,但当我们考虑 mycpy(str+1,str)的情况,由于在赋值时dst把'\0'给覆盖掉了(dst,src都是str,但是dst先走一步,str的'\0'被覆盖后,src就找不到了),程序会报错。
3.考虑内存重叠问题。
显然,内存重叠只出现在当 src<=dst<=src+strlen(src) 保证在是同一字符串且dst先于src
char* mymemcpy(char *dst, const char *src, int cnt){
assert(dst != NULL);
assert(src != NULL);
char *ret = dst;
if (dst >= src && dst <= src+cnt-1){ // src<=dst<=src+strlen(src)
dst = dst + cnt -1;
src = src + cnt -1;
while (cnt--){ //从高地址开始赋值
*dst-- = *src--;
}
}else{
while (cnt--){ //普通情况,低地址开始赋值
*dst++ = *src++;
}
}
return ret;
}
char * mycpy(char *dst, const char * src){
assert(dst != NULL);
assert(src != NULL);
char *ret = dst;
// while ((*dst++ = *src++) != '\0');
mymemcpy(dst,src,strlen(src)+1); // strlen(src)+1 是因为要把'\0'考虑在内
return ret;
}
此时,重写的mycpy函数就相对比较完整了。