strcpy与memcpy


81

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]

Answers:


127

该怎么做才能看到这种效果

编译并运行以下代码:

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
您好,我知道该帖子很旧,但是对此有两个问题。首先-printf("%2.2x ", *p);为什么将printf限制为2.2?此外,我根本看不到点。第二-printf("%c", *p ? *p : ' ');这项测试真正检查了什么?如果*p?预先感谢您的回答!
彼得·塞巴

14
在printf语句中,“ x”表示“基数16”。“ 2.2”表示:两位数,只有两位数。该*p测试的意思是:“如果您输入空值,请打印一个空格。”
egrunin 2012年

85

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


2
@Sachin:初始化pt东西(全部为空白,例如),然后复制后,比较p[3]t[3]。在strcpy没有超越p[2],在那里找到了空字符,但memcpy作为直接复制五个字符。
卡斯卡贝尔

9
次要nit-pick:strcpy遇到NUL字符(一个“ L”)时停止。NULL(两个“ L”)是保证不会指向任何有效对象的指针的编译时常量。
丹尼尔·斯图兹巴赫

谢谢,我得到了答案
Sachin Chourasiya 2010年

如果dest和src重叠,strcpy会抛出段错误吗?
奥尔科特

12

strcpy找到源字符串的空终止符时终止。memcpy需要传递一个size参数。在您呈现的情况下printf,在找到两个字符数组的空终止符后,该语句将暂停,但是您还将找到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
  • 行为差异:strcpy遇到NULL或时停止'\0'
  • 性能差异:memcpy通常比strcpy总是扫描要复制的数据的效率更高

2

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


1

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

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


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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.