strcpy与memcpy

时间:2010-05-24 16:09:11

标签: c memcpy strcpy

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]

9 个答案:

答案 0 :(得分: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()

答案 1 :(得分:66)

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

答案 2 :(得分:12)

当找到源字符串的null终止符时,

strcpy终止。 memcpy需要传递大小参数。如果您在两个字符数组找到空终止符之后显示printf语句暂停,则您会发现t[3]t[4]也在其中复制了数据。

答案 3 :(得分:9)

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

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

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

如果您知道源包含非字符,则应使用

memcpy。对于加密数据或二进制数据,memcpy是理想的方式。

不推荐使用

strcpy,因此请使用strncpy

答案 4 :(得分:3)

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

  • 行为差异:strcpy在遇到NULL'\0'
  • 时停止
  • 效果差异:memcpy通常比strcpy效率更高,RFC connection options: [...] -2 SNA mode on. You must set this if you want to connect to R/2. [...] -3 R/3 mode on. You must set this if you want to connect to R/3. 始终扫描复制的数据

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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;
}