成功源于积累----波爸

思想决定高度,行动决定成败!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

strcpy和memcpy都是标准C库函数,它们有下面特点:

strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容外,还会复制字符串的结束符。

strcpy的函数原型是:char* strcpy(char* dest, const char* src);

 

memcpy只提供一般的内存复制,即memcpy对于需要复制的内容没有限制,因此用途更广。

memcpy的函数原型是:void *memcpy(void *dest,  const char* src,  size_t count);

 

View Code
 1 char *strcpy(char *dest, const char *src)
 2 {
 3     if((src == NULL) || (dest == NULL))
 4     {
 5          return NULL;
 6     }
 7 
 8     char *strdest = dest; // 保存目标字符串的首地址
 9     while((*dest++ = *str) != '\0');
10     return strdest;
11 }

 

 

void *memcpy(void *memTo, const char *memFrom, size_t size)
{
     if((memTo == NULL) || (memFrom == NULL))
     {
          return NULL;
     }

     char *tempFrom = (char *)memFrom; //保存memFrom的首地址
     char *tempTo = (char *)memTo; //保存memTo的首地址
      while(size-- > 0)
     {
          *tempTo++ = *tempFrom++;
     }
     return memTo;
}

 

strcpy 和 memcpy主要有以下三方面的区别:

1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符串的结束符"\0”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。

3、用途不同。通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。

 

memcpy 和 memmove 都是C语言中的库函数,在库函数 string.h中,其原型相似,它们都是从src所指向的内存中复制count个字节到dest所指内存中。并返回dest的值。

当源内存区域 和 目标内存区域无交叉重叠时,两者的结果是一样的,但如果有交叉呢?

memcpy是从src的其实部分开始复制,所以虽然第一种情况下没有问题,但如果遇到第二种情况,则会发生错误,交叉部分的src内容就会被覆盖掉了。

而memmove则由于采用不同的复制机制,所以可以正确处理第二种情况。

 

 

void *memmove(void *dst,const void *src,int n)
{
     char *dp = (char *)dst;
     char *sp = (char *)src; 
     assert((src!=0)&&(dst!=0)&&(n>0));//not null 
     
//非重叠 
      
//dp < sp 
     
//dp > (sp+n)
     if(sp>dp||(sp+n)<dp)
     { 
         while(n--) 
             *(dp++) = *(sp++);
         *dp = '\0';
     }
     else if(sp<dp)//重叠 (此时条件 sp<dp<(sp+n))如果sp==dp则快速的返回
     {//反向拷贝  
          sp += n; 
         dp += n; 
         *dp = '\0'
         while(n--)
            *(--dp) = *(--sp); 
     }
     return dst;
}       

 

posted on 2012-05-23 18:53  沙场醉客  阅读(6011)  评论(1编辑  收藏  举报