98 votes

strcpy vs. memcpy

Quelle est la différence entre memcpy() et strcpy() ? J'ai essayé de le trouver à l'aide d'un programme, mais les deux donnent le même résultat.

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

Sortie

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

142voto

egrunin Points 15356

ce qui pourrait être fait pour voir cet effet

Compilez et exécutez ce code :

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

Il produira cette sortie :

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

Vous pouvez voir que le "ch" a été copié par memcpy(), mais pas strcpy().

115voto

Yann Ramin Points 25139

strcpy s'arrête quand il rencontre un caractère nul ('\0'), memcpy ne s'arrête pas. Vous ne voyez pas l'effet ici, car %s dans printf s'arrête aussi à nul.

13voto

fbrereto Points 21711

strcpy se termine lorsque le terminateur NULL de la chaîne source est trouvé. memcpy nécessite qu'un paramètre de taille soit passé. Dans le cas où vous présentez l'instruction printf s'arrête après que le terminateur NULL est trouvé pour les deux tableaux de caractères, cependant, vous trouverez t[3] t[4] ont également copié des données dans ceux-ci.

5voto

Jeremy Friesner Points 16684

La principale différence est que memcpy() copie toujours le nombre exact d'octets que vous spécifiez ; strcpy(), en revanche, copiera jusqu'à ce qu'il lise un octet NUL (aka 0), puis s'arrêtera après cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X