aurain
技术文摘
posts - 137,  comments - 268,  trackbacks - 0

void* memcpy(void* pvTo, const void* pvForm, size_t size)
{
 assert((pvTo!= NULL) && (pvFrom!= NULL));//使用断言防止传递空地址
 unsigned char* pbTo = (unsigned char*)pvTo;//防止改变pvTo的地址
 unsigned char* pbFrom = (unsigned char*)pvFrom;//防止改变pvFrom的地址
 while(size-- > 0)
 {
  *pbTo++ = *pbFrom++;
 }
 return pvTo;
}

char* strcpy(char* pDest, const char* pSrc)
{
 assert((pDest != NULL) && (pSrc != NULL));
 char *pTmp = pDest;
 while ((*pDest++ = *pSrc++) != '\0')
  ;
 return pTmp;
}

posted on 2008-04-22 09:51 阅读(7384) 评论(2)  编辑 收藏 引用 所属分类: c/c++基础知识

FeedBack:
# re: memcpy与strcpy实现
2008-08-27 20:35 | temp
do not forget const  回复  更多评论
  
# re: memcpy与strcpy实现
2009-07-23 22:10 | flame
//注意数据重叠区的处理。
// |----------|
// |----------|

void *MyMemCopy(void *dest,const void *src,size_t count)
{
char *pDest=static_cast<char *>(dest);
const char *pSrc=static_cast<const char *>(src);

//注意,这里是关键,为什么要这样比较呢?理由何在?
if( pDest>pSrc && pDest<pSrc+count )
{
for(size_t i=count-1; i>=0; --i)
{
pDest[i]=pSrc[i];
}
}
else
{
for(size_t i=0; i<count; ++i)
{
pDest[i]=pSrc[i];
}
}

return pDest;
}  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2009年1月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(17)

随笔分类(138)

随笔档案(137)

网络开发

最新随笔

搜索

  •  

积分与排名

  • 积分 - 493598
  • 排名 - 36

最新随笔

最新评论

阅读排行榜

评论排行榜