2010-05-24 52 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)