strcpy与memcpy

问题描述 投票:65回答:8

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]
c memcpy strcpy
8个回答
105
投票

怎么办才能看到这种效果

编译并运行此代码:

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


66
投票

strcpy在遇到NULL时停止,memcpy没有。你没有在这里看到效果,因为printf中的%s也在NULL处停止。


12
投票

当找到源字符串的null终止符时,strcpy终止。 memcpy需要传递尺寸参数。在你提出printf语句的情况下,在找到两个字符数组的null终止符之后暂停,但是你会发现t[3]t[4]也在其中复制了数据。


9
投票

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

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

其中memcpy将数据(非字符)从给定大小n的源复制到目标,而不管源中的数据如何。

如果您知道源包含非字符,则应使用memcpy。对于加密数据或二进制数据,memcpy是理想的方式。

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


3
投票

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


2
投票

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


2
投票
  • 行为差异:strcpy遇到NULL'\0'时停止
  • 性能差异:memcpy通常比strcpy更有效,printf()总是扫描它复制的数据

0
投票

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

我在GNU strcpy()中看到,(对于x86)memcpy(dest, src, strlen(src) + 1)只是调用qazxswpoi。

© www.soinside.com 2019 - 2024. All rights reserved.