it-swarm.com.de

strcpy vs. memcpy

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

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

was könnte man tun, 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 memcpy() kopiert wurde, nicht jedoch von strcpy().

104
egrunin

strcpy stoppt, wenn NULL auftritt, memcpy nicht. Sie sehen den Effekt hier nicht, da %s in printf auch bei NULL stoppt.

64
Yann Ramin

Die Variable strcpy wird beendet, wenn der Nullabschluss der Quellzeichenfolge gefunden wird. memcpy erfordert, dass ein Größenparameter übergeben wird. In dem von Ihnen vorgestellten Fall wird die printf-Anweisung angehalten, nachdem der Nullterminator für beide Zeichen-Arrays gefunden wurde. Allerdings finden Sie, dass t[3] und t[4] auch Daten darin kopiert haben.

12
fbrereto

strcpy kopiert das Zeichen einzeln von der Quelle zum Ziel, bis es NULL- oder '\ 0'-Zeichen in der Quelle findet.

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

dabei ist memcpy das Kopieren von Daten (nicht Zeichen) von Quelle zu Ziel mit der angegebenen Größe n, unabhängig von den Daten in der Quelle.

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

strcpy ist veraltet, verwenden Sie also strncpy.

9
Viswesn

Aufgrund des Nullzeichens in Ihrer s-Zeichenfolge zeigt die printf darüber hinaus nichts an. Der Unterschied zwischen p und t liegt in den Zeichen 4 und 5. p hat keine (sie sind Müll) und t wird 'c' und 'h' haben. 

3

Der Hauptunterschied besteht darin, dass memcpy () immer die exakte Anzahl von Bytes kopiert, die Sie angeben. strcpy () hingegen kopiert, bis es ein NUL (aka 0) Byte liest, und stoppt danach.

2
Jeremy Friesner
  • Verhaltensunterschied: strcpy stoppt, wenn eine NULL oder ein '\0' gefunden wird
  • Leistungsunterschied: memcpy ist normalerweise effizienter als strcpy, da diese immer die kopierten Daten scannen
1
euccas

Das Problem mit Ihrem Testprogramm ist, dass printf() das Einfügen des Arguments in %s stoppt, wenn es auf eine Null-Terminierung \0..__ stößt. In Ihrer Ausgabe haben Sie wahrscheinlich nicht bemerkt, dass memcpy() die Zeichen c und h als kopiert hat Gut.

Ich habe in GNU glibc-2.24 gesehen, dass (für x86) strcpy() nur memcpy(dest, src, strlen(src) + 1) aufruft.

0
Jaspar L.