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