strcpy和memcpy

strcpy和memcpy都是標準c庫函數,它們的特點:

strcpy提供了字符串的複製,strcpy只用於字符串的複製,不僅複製字符串內容外,還會複製字符串的結束符。

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

[cpp] view plain copy
  1. char *strcpy(char *dest,const char *src){  
  2.     if((src==NULL)||(dest==NULL)) return NULL;  
  3.     char *strdest = dest;//保存目標字符串的首地址  
  4.     while((*dest++=*src++)!='\0');  
  5.     return strdest;  
  6. }  


memcpy函數的功能是從源src所指的內存地址的起始位置開始拷貝n個字符到目標dest所指的

內存地址的起始位置。

memcpy只提供一般的內存複製,即memcpy對於需要複製的內容沒有限制,因此用途更廣。

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

[cpp] view plain copy
  1. void *memcpy(void *memTo,const void *memFrom,size_t size){  
  2.     if((memTo==NULL)||(memFrom==NULL)) return NULL;  
  3.     char *tempFrom = (char *)memFrom;//保存memFrom的首地址  
  4.     char *tempTo = (char *)memTo;//保存memTo的首地址  
  5.     while(size-->0){  
  6.         *tempTo++=*tempFrom++;  
  7.     }  
  8.     return memTo;  
  9. }  

strcpy和memcpy主要有以下三點區別:

1.複製的內容不同,strcpy只能複製字符串,而memcpy可以複製任意內容,例如字符串,整型,結構體,類等。

2.複製的方法不同。strcpy不需要指定長度,它遇到被複制字符串的結束符'\0'才結束,所以容易溢出。

memcpy則是根據第三個參數決定複製的長度。

3.用途不同,通常在複製字符串時使用strcpy,而複製其他類型的數據是memcpy。


memcpy和memmove都是C語言中的庫函數,在庫函數string.h中,其原型很相似,它們都是從src所指向的

內存中複製cnt個字符到dest所指向的內存中,並返回dest的值。

當源內存區域和目標內存區域無交叉重疊時,兩者的結果是一樣的,但是如果有交叉呢?

memcpy是從src的起始部分開始複製,所以雖然第一種情況下沒有問題,但是如果遇到第二種情況,

則會發生錯誤,交叉部分的src內容就會被覆蓋掉了。

而memmove則由於採用不同的複製機制,所以可以正確處理第二種情況。

assert宏的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程序執行。

[cpp] view plain copy
  1. void *memmove(void *dst,const void *src,int n){  
  2.     char *dp = (char *)dst;  
  3.     char *sp = (char *)src;  
  4.     assert((src!=0)&&(dst!=0)&&(n>0));  
  5.     if(sp>dp||(sp+n)<dp)//非重疊  
  6.     {  
  7.         while(n--)  
  8.             *(dp++)=*(sp++);  
  9.         *dp='\0';  
  10.     }  
  11.     else if(sp<dp){//重疊 此時條件 sp<dp<(sp+n) 如果sp==dp則快速的返回  
  12.         //反向拷貝  
  13.         sp+=n;  
  14.         dp+=n;  
  15.         *dp='\0';  
  16.         while(n--)  
  17.             *(--dp)=*(--sp);  
  18.     }  
  19.     return dst;  
  20. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章