2010-05-24 27 views
53

¿Cuál es la diferencia entre memcpy() y strcpy()? Traté de encontrarlo con la ayuda de un programa, pero ambos están dando el mismo resultado.strcpy vs. memcpy

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

salida

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

Consulte http://stackoverflow.com/questions/2884874/when-to-use-strncpy-or-memmove –

Respuesta

92

lo que se podría hacer para ver este efecto

compilar y ejecutar este código:

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

Se producirá esta salida:

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

Se puede ver que el "ch" fue copiado por memcpy(), pero no strcpy().

+1

Muchas gracias por la explicación clara. –

+1

Hola, sé que la publicación es antigua, pero tengo dos preguntas al respecto. Primero - 'printf ("% 2.2x ", * p);' - ¿por qué limitaste printf a 2.2? Además, no puedo ver ningún punto ... Segundo - 'printf ("% c ", * p? * P: '');' - ¿Qué comprueba realmente esta prueba? Si '* p'? ¡Gracias de antemano por su respuesta! –

+7

En una declaración printf, "x" significa "base 16". "2.2" significa: dos y solo dos dígitos. La prueba '* p' significa:" si tocas un nulo, imprime un espacio ". – egrunin

52

strcpy paradas cuando encuentra un NULL, memcpy no. Aquí no se ve el efecto, ya que %s en printf también se detiene en NULL.

+0

entonces, ¿qué se podría hacer para ver este efecto? –

+2

@Sachin: Inicialice 'p' y' t' para algo (todos los espacios en blanco, por ejemplo), luego después de copiar, compare 'p [3]' a 't [3]'. El 'strcpy' no fue más allá de' p [2] ', donde encontró el carácter nulo, pero' memcpy' como se indica copió cinco caracteres. – Cascabel

+8

Minit nit-pick: Strcpy se detiene cuando encuentra el carácter NUL (una "L"). NULL (dos "L" s) es una constante en tiempo de compilación para un puntero que garantiza que no apunta a ningún objeto válido. –

2

La principal diferencia es que memcpy() siempre copia el número exacto de bytes que especifique; strcpy(), por otro lado, copiará hasta que lea un byte NUL (también conocido como 0), y luego se detendrá después de eso.

3

Debido al carácter nulo en su cadena s, el printf no mostrará nada más allá. La diferencia entre p y t estará en los caracteres 4 y 5. p no tendrá ninguno (serán basura) y t tendrá la 'c' y la 'h'.

12

strcpy termina cuando se encuentra el terminador nulo de la cadena fuente. memcpy requiere que se pase un parámetro de tamaño. En el caso que presentó la declaración printf se detiene después de encontrar el terminador nulo para ambas matrices de caracteres, sin embargo, encontrará que t[3] y t[4] también han copiado datos en ellos.

9

strcpy copia el carácter de origen a destino uno por uno hasta que encuentre el carácter NULL o '\ 0' en la fuente.

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

donde como memcpy copias de datos (no de caracteres) desde el origen al destino de tamaño dado n, con independencia de los datos de origen.

memcpy se debe utilizar si usted sabe bien que la fuente no contiene caracteres. para datos encriptados o datos binarios, memcpy es el camino ideal a seguir.

strcpy está obsoleto, por lo tanto, use strncpy.

0
  • Comportamiento diferencia: strcpy paradas cuando encuentra una diferencia NULL o '\0'
  • Rendimiento: memcpy es generalmente más eficiente que strcpy, que siempre mira los datos de TI copias
0

El problema con la prueba -program es que el printf() deja de insertar el argumento en %s, cuando encuentra una terminación nula \0. Por lo tanto, en su salida probablemente no haya notado que memcpy() copió los caracteres c y h también.

He visto en GNU glibc-2.24, que (para x86) strcpy() simplemente llama a memcpy(dest, src, strlen(src) + 1).