【C/C++】 实现strcpy并考虑内存重叠

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函数就相对比较完整了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值