2010-05-24 39 views
53

memcpy()和strcpy()有什麼區別?我試圖在程序的幫助下找到它,但兩者都提供相同的輸出。strcpy與memcpy

int main() 
{ 
    char s[5]={'s','a','\0','c','h'}; 
    char p[5]; 
    char t[5]; 
    strcpy(p,s); 
    memcpy(t,s,5); 
    printf("sachin p is [%s], t is [%s]",p,t); 
    return 0; 
} 

輸出

sachin p is [sa], t is [sa] 
+1

請參閱http://stackoverflow.com/questions/2884874/when-to-use-strncpy-or-memmove – 2010-05-24 16:29:44

回答

92

什麼可以做,看看這個效果

編譯並運行此代碼:

void dump5(char *str); 

int main() 
{ 
    char s[5]={'s','a','\0','c','h'}; 

    char membuff[5]; 
    char strbuff[5]; 
    memset(membuff, 0, 5); // init both buffers to nulls 
    memset(strbuff, 0, 5); 

    strcpy(strbuff,s); 
    memcpy(membuff,s,5); 

    dump5(membuff); // show what happened 
    dump5(strbuff); 

    return 0; 
} 

void dump5(char *str) 
{ 
    char *p = str; 
    for (int n = 0; n < 5; ++n) 
    { 
     printf("%2.2x ", *p); 
     ++p; 
    } 

    printf("\t"); 

    p = str; 
    for (int n = 0; n < 5; ++n) 
    { 
     printf("%c", *p ? *p : ' '); 
     ++p; 
    } 

    printf("\n", str); 
} 

它會產生這樣的輸出:

73 61 00 63 68 sa ch 
73 61 00 00 00 sa 

你可以看到, 「ch」由memcpy()複製,但不是strcpy()

+1

非常感謝您的明確解釋。 – 2010-05-26 06:48:52

+1

你好,我知道這個帖子很老,但我有兩個問題。首先 - 'printf(「%2.2x」,* p);' - 爲什麼你將printf限制爲2.2?除此之外,我完全可以看到NO dot ...第二個 - 'printf(「%c」,* p?* p:'');' - 這個測試真的檢查了什麼?如果'* p'?在此先感謝您的答案! – 2012-08-30 09:02:07

+7

在printf語句中,「x」表示「base 16」。 「2.2」表示:兩個且僅有兩位數字。 '* p'測試的意思是:「如果你點擊一個null,打印一個空格。」 – egrunin 2012-08-30 15:43:28

52

strcpy停止當它遇到一個NULL,memcpy沒有。您在這裏看不到效果,因爲printf中的%s也停在NULL處。

+0

然後可以做什麼看到這種效果 – 2010-05-24 16:17:41

+2

@Sachin:初始化'p'和't'到(例如所有空格),然後在複製之後,比較'p [3]'到't [3]'。 'strcpy'沒有超出'p [2]',在那裏它找到了空字符,但是'memcpy'按照指示覆制了五個字符。 – Cascabel 2010-05-24 16:23:50

+8

小挑剔:當遇到NUL字符(一個「L」)時,strcpy停止。 NULL(兩個「L」)是一個保證不指向任何有效對象的指針的編譯時常量。 – 2010-05-25 01:52:18

2

主要區別在於memcpy()總是複製您指定的確切字節數;另一方面,strcpy()會複製,直到它讀取一個NUL(aka 0)字節,然後停止。

3

由於s字符串中的空字符,printf將不會顯示除此之外的任何內容。 p和t之間的差別將是字符4和5. p不會有任何(它們將是垃圾),並且t將具有'c'和'h'。

12

strcpy在找到源字符串的空終止符時終止。 memcpy需要傳遞大小參數。如果您提出printf語句在爲兩個字符數組找到空終止符後停止,您會發現t[3]t[4]也複製了它們中的數據。

9

strcpy從源到目的地逐個拷貝字符,直到它在源中找到NULL或'\ 0'字符。

while((*dst++) = (*src++)); 

其中從源到給定的大小爲n的目的地memcpy副本數據(未字符),而不管數據源。

memcpy應該使用,如果你知道源包含除字符以外。對於加密數據或二進制數據,memcpy是理想的選擇。

strcpy已棄用,所以請使用strncpy

0
  • 行爲差異:strcpy停止時遇到一個NULL'\0'
  • 性能差異:memcpy通常比strcpy更高效,它總是掃描數據它複製
0

問題與測試 - 程序是,printf()停止插入參數到%s,當它遇到空終止\0。 因此,在您的輸出中,您可能沒有注意到,memcpy()也複製了字符ch

我在GNU glibc-2.24中看到,(對於x86)strcpy()只是調用memcpy(dest, src, strlen(src) + 1)