strcpy和memcpy,memmove函數的區別


strcpy和memcpy的區別

strcpy和memcpy都是標准C庫函數,它們有下面的特點。 strcpy提供了字符串的復制。即strcpy只用於字符串復制,並且它不僅復制字符串內容之外,還會復制字符串的結束符。

已知strcpy函數的原型是:char* strcpy(char* dest, const char* src); memcpy提供了一般內存的復制。即memcpy對於需要復制的內容沒有限制,因此用途更廣。

 http://blog.csdn.net/gpengtao/article/details/7464061/(實現系統中strcpy函數)

char * strcpy(char * dest, const char * src) // 實現src到dest的復制

{

  if ((src == NULL) || (dest == NULL)) //判斷參數src和dest的有效性

  {
      return NULL;
  }

  char *strdest = dest;        //保存目標字符串的首地址

  while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的內容復制到dest下

  return strdest;

}
void *memcpy(void *memTo, const void *memFrom, size_t size) {   if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必須有效 return NULL;   char *tempFrom = (char *)memFrom; //保存memFrom首地址   char *tempTo = (char *)memTo; //保存memTo首地址   while(size -- > 0) //循環size次,復制memFrom的值到memTo中   *tempTo++ = *tempFrom++ ;   return memTo; }

strcpy和memcpy主要有以下3方面的區別。
1、復制的內容不同。strcpy只能復制字符串,而memcpy可以復制任意內容,例如字符數組、整型、結構體、類等。
2、復制的方法不同。strcpy不需要指定長度,它遇到被復制字符的串結束符"\0"才結束,所以容易溢出。memcpy則是根據其第3個參數決定復制的長度。
3、用途不同。通常在復制字符串時用strcpy,而需要復制其他類型數據時則一般用memcpy

 

簡述strcpy與memcpy的相同點和區別點

 

相同點:strcpy與memcpy都可以實現拷貝的功能

不同點:

(1)實現功能不同,strcpy主要實現字符串變量間的拷貝,memcpy主要是內存塊間的拷貝。

(2)操作對象不同,strcpy的操作對象是字符串,memcpy 的操作對象是內存地址,並不限於何種數據類型。

(3)執行效率不同,memcpy最高,strcpy次之。

 

原型:  void *memmove( void* dest, const void* src, size_tcount );

#include<string.h>

由src所指內存區域復制count個字節到dest所指內存區域。

src和dest所指內存區域可以重疊,但復制后dest內容會被更改。函數返回指向dest的指針

 

memmove的處理措施:

(1)當源內存的首地址等於目標內存的首地址時,不進行任何拷貝

(2)當源內存的首地址大於目標內存的首地址時,實行正向拷貝

(3)當源內存的首地址小於目標內存的首地址時,實行反向拷貝

 

void *mymemmove(void *dest,const void *src,size_t count)  
{  
    char *ret=(char *)dest;  
    char *dest_t=dest;  
    char *src_t=(char *)src;  
    assert( NULL !=src && NULL !=dest);  
      
    if (dest_t<=src_t || dest_t>=src_t+count)  
    {  
        while(count--)  
        {  
            *dest_t++ = *src_t++;  
        }  
    }  
    else  
    {  
        dest_t+=count-1;  
        src_t+=count-1;  
        while(count--)  
        {  
            *dest_t--=*src_t--;  
        }  
    }  
    return ret;  
}  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM