88

memcpy()和 和有什么不一样strcpy()?我试图在程序的帮助下找到它,但两者都给出了相同的输出。

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]
4

9 回答 9

133

可以做些什么来看到这种效果

编译并运行这段代码:

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()

于 2010-05-24T22:14:35.997 回答
99

strcpy遇到 NUL ( '\0') 字符时停止,memcpy不会。您在这里看不到效果,因为%sprintf 也停止在 NUL。

于 2010-05-24T16:11:27.847 回答
13

strcpy当找到源字符串的空终止符时终止。memcpy需要传递一个大小参数。在您提出的情况下,在printf为两个字符数组找到空终止符后,语句将停止,但是您也会在其中找到t[3]t[4]复制数据。

于 2010-05-24T16:12:43.337 回答
9

strcpy将字符从源一个接一个地复制到目标,直到在源中找到 NULL 或 '\0' 字符。

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

其中 as 将memcpy数据(不是字符)从源复制到给定大小 n 的目标,而与源中的数据无关。

memcpy如果您很清楚该来源包含字符以外的内容,则应该使用它。对于加密数据或二进制数据,memcpy 是理想的选择。

strcpy已弃用,因此请使用strncpy.

于 2012-12-05T12:36:32.383 回答
4

主要区别在于memcpy()始终复制您指定的确切字节数;strcpy()另一方面,它将复制直到它读取一个 NUL(又名 0)字节,然后在此之后停止。

于 2010-05-24T16:11:51.223 回答
3

由于s字符串中的空字符,printf除此之外不会显示任何内容。pand之间的区别t将在字符 4 和 5中。p不会有任何(它们将是垃圾)并且t会有'c'and 'h'

于 2010-05-24T16:12:03.797 回答
3
  • 行为差异:strcpy遇到NULL或时停止'\0'
  • 性能差异:memcpy通常比 更有效strcpy,后者总是扫描它复制的数据
于 2017-01-19T18:33:52.290 回答
2

您的测试程序的问题是,当遇到空终止时,printf()停止将参数插入到中。所以在你的输出中你可能没有注意到,它也复制了字符。%s\0memcpy()ch

我在 GNU 中看到glibc-2.24,(对于 x86)strcpy()只是调用memcpy(dest, src, strlen(src) + 1).

于 2018-02-16T13:18:50.247 回答
1

printf("%s",...)遇到 null 时停止打印数据,因此两个输出都相同。

以下代码区分strcpymemcpy

#include<stdio.h>
#include<string.h>

int main()
{
    char s[5]={'s','a','\0','c','h'};
    char p[5];
    char t[5];
    int i;
    strcpy(p,s);
    memcpy(t,s,5);
    for(i=0;i<5;i++)
        printf("%c",p[i]);
        printf("\n");
    for(i=0;i<5;i++)
        printf("%c",t[i]);

    return 0;
}
于 2020-05-10T05:24:05.087 回答