strcpy contra memcpy

4 minutos de lectura

strcpy contra memcpy
Sachin Chourasiya

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

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

Producción

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

  • Ver stackoverflow.com/questions/2884874/…

    –Doug Currie

    24 de mayo de 2010 a las 16:29

strcpy contra memcpy
egrunín

¿Qué se podría hacer para ver este efecto?

Compila y ejecuta 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);
}

Producirá esta salida:

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

Puedes ver que la “ch” fue copiada por memcpy()pero no strcpy().

  • 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 en absoluto… Segundo – printf("%c", *p ? *p : ' '); – ¿Qué comprueba realmente esta prueba? Si *p ? ¡Gracias de antemano por su respuesta!

    -Peter Cerba

    30 de agosto de 2012 a las 9:02

  • En una instrucción printf, “x” significa “base 16”. “2.2” significa: dos y solo dos dígitos. los *p prueba significa: “si golpea un nulo, imprima un espacio”.

    – egrunín

    30 de agosto de 2012 a las 15:43

1646753349 957 strcpy contra memcpy
yan ramin

strcpy se detiene cuando encuentra un NUL ('\0') personaje, memcpy no. No ves el efecto aquí, como %s en printf también se detiene en NUL.

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

    – Cascabel

    24 de mayo de 2010 a las 16:23

  • Peculiaridad menor: strcpy se detiene cuando encuentra el carácter NUL (una “L”). NULL (dos “L”) es una constante de tiempo de compilación para un puntero garantizado para no apuntar a ningún objeto válido.

    – Daniel Stützbach

    25 de mayo de 2010 a las 1:52

  • si dest y src se superponen, strcpy arrojará una falla de segmento?

    – Alcott

    16 de septiembre de 2011 a las 12:37

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

1646753350 171 strcpy contra memcpy
Viswesn

strcpy copia el carácter del origen al destino uno por uno hasta que encuentra el carácter NULL o ‘\0’ en el origen.

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

mientras que memcpy copia datos (no caracteres) desde el origen hasta el destino de un tamaño dado n, independientemente de los datos en el origen.

memcpy debe usarse si sabe bien que la fuente contiene algo que no sea carácter. para datos cifrados o datos binarios, memcpy es la forma ideal de hacerlo.

strcpy está en desuso, así que use strncpy.

strcpy contra memcpy
jeremy friesner

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.

  • Diferencia de comportamiento: strcpy se detiene cuando se encuentra con un NULL o '\0'
  • Diferencia de rendimiento: memcpy suele ser más eficiente que strcpyque siempre escanea los datos que copia

1646753350 634 strcpy contra memcpy
Ayxan Haqverdili

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad