strcpy vs. memcpy

Lesezeit: 3 Minuten

Benutzeravatar von Sachin Chourasiya
Sachin Chourasiya

Was ist der Unterschied zwischen memcpy() und strcpy()? Ich habe versucht, es mit Hilfe eines Programms zu finden, aber beide geben die gleiche Ausgabe.

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

Ausgabe

sachin p is [sa], t is [sa]

  • Siehe stackoverflow.com/questions/2884874/…

    – Doug Currie

    24. Mai 2010 um 16:29 Uhr

Benutzeravatar von egrun
Egruin

was getan werden könnte, um diesen Effekt zu sehen

Kompilieren Sie diesen Code und führen Sie ihn aus:

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

Es wird diese Ausgabe erzeugen:

73 61 00 63 68  sa ch
73 61 00 00 00  sa

Sie können sehen, dass das “ch” von kopiert wurde memcpy()aber nicht strcpy().

  • Hallo, ich weiß, dass dieser Beitrag alt ist, aber ich habe zwei Fragen dazu. Zuerst – printf("%2.2x ", *p); – warum hast du printf auf 2.2 begrenzt? Außerdem kann ich überhaupt KEINEN Punkt sehen … Zweitens – printf("%c", *p ? *p : ' '); – Was überprüft dieser Test wirklich? Wenn *p ? Vielen Dank im Voraus für Ihre Antwort!

    – Peter Cerba

    30. August 2012 um 9:02 Uhr

  • In einer printf-Anweisung bedeutet “x” “Basis 16”. “2.2” bedeutet: zwei und nur zwei Ziffern. Das *p Test bedeutet: “Wenn Sie eine Null treffen, geben Sie ein Leerzeichen aus.”

    – Egruin

    30. August 2012 um 15:43 Uhr

Benutzeravatar von Yann Ramin
Jan Ramin

strcpy stoppt, wenn es auf eine NUL trifft ('\0') Charakter, memcpy nicht. Sie sehen den Effekt hier nicht, da %s in printf stoppt auch bei NUL.

  • @Sachin: Initialisieren p und t zu etwas (z. B. alle Leerzeichen), dann nach dem Kopieren vergleichen p[3] zu t[3]. Das strcpy ging nicht darüber hinaus p[2]wo es das Nullzeichen gefunden hat, aber die memcpy wie angewiesen fünf Zeichen kopiert.

    – Kaskabel

    24. Mai 2010 um 16:23 Uhr

  • Kleine Spitzfindigkeit: strcpy stoppt, wenn es auf das NUL-Zeichen (ein “L”) trifft. NULL (zwei „L“) ist eine Kompilierzeitkonstante für einen Zeiger, der garantiert nicht auf ein gültiges Objekt zeigt.

    – Daniel Stützbach

    25. Mai 2010 um 1:52 Uhr

  • wenn sich dest und src überschneiden, wird strcpy einen seg-fault ausgeben?

    – Alcott

    16. September 2011 um 12:37 Uhr

strcpy wird beendet, wenn das Null-Terminatorzeichen der Quellzeichenfolge gefunden wird. memcpy erfordert die Übergabe eines Größenparameters. In dem Fall, dass Sie die präsentiert haben printf Die Anweisung wird angehalten, nachdem das Null-Terminator für beide Zeichen-Arrays gefunden wurde, wie auch immer Sie finden werden t[3] und t[4] haben auch Daten in sie kopiert.

Benutzeravatar von Viswesn
Viswestn

strcpy kopiert ein Zeichen nach dem anderen von der Quelle zum Ziel, bis es ein NULL- oder ‘\0’-Zeichen in der Quelle findet.

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

wohingegen memcpy kopiert Daten (keine Zeichen) von der Quelle zum Ziel der gegebenen Größe n, unabhängig von den Daten in der Quelle.

memcpy sollte verwendet werden, wenn Sie genau wissen, dass die Quelle andere als Zeichen enthält. Für verschlüsselte Daten oder binäre Daten ist memcpy der ideale Weg.

strcpy ist veraltet, also verwenden strncpy.

Benutzeravatar von Jeremy Friesner
Jeremy Friesner

Der Hauptunterschied ist das memcpy() kopiert immer die genaue Anzahl von Bytes, die Sie angeben; strcpy()auf der anderen Seite, kopiert, bis es ein NUL-Byte (auch bekannt als 0) liest, und stoppt danach.

  • Verhaltensunterschied: strcpy stoppt, wenn es auf a trifft NULL oder '\0'
  • Leistungsunterschied: memcpy ist in der Regel effizienter als strcpydie die kopierten Daten immer scannt

Benutzeravatar von Ayxan Haqverdili
Ayxan Haqverdili

Aufgrund des Nullzeichens in Ihrer s Schnur, die printf darüber hinaus wird nichts angezeigt. Der Unterschied zwischen p und t wird in Zeichen 4 und 5 sein. p wird keine haben (sie werden Müll sein) und t wird die haben 'c' und 'h'.

1420140cookie-checkstrcpy vs. memcpy

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy