strcpy memcpy 完整代码,包括内存块重叠的的情况

下面例1是修改网络上source code得到的一个版本,简洁,完全可以工作,但是没有考虑到src与dest的有重叠区域的情况,例2是个人修改后的代码,考虑了重叠的情况.留着备用,时刻提醒自己要注意代码风格及全面考虑问题.memcpy原理类似.
例1:
char *strcpy2(char *strDest, const char *strSrc)
{
assert( (strDest!=NULL) && ( strSrc!=NULL));
 if ( strDest == strSrc)
   return strDest ;
 char *pDest = strDest ;
 char *pSrc =strSrc;
 while( (*pDest ++ = *pSrc ++) != '\0');
 return strDest;
}

例2: 防止出现src与dest有重叠的情况
char *strcpy(char *pDst,const char *pSrc)
{
 assert(pDst != NULL);
 assert(pSrc != NULL);
 size_t size = strlen(pSrc);
 //src and dst has a  shared area.
 if((pSrc<pDst) && ((char*)pSrc+size > pDst))
 {
  char *pstrSrc= (char *)pSrc + size -1;
  char *pstrDst = (char *)pDst + size -1;
while(size--)
   *pstrDst -- = *pstrSrc--;
 }
 else
 {
  char *pstrSrc= (char *)pSrc ;
  char *pstrDst = (char *)pDst ;
while(size--)
   *pstrDst++ = *pstrSrc++;
 }
 return(pDst);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值