¿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;
}
Salida
sachin p is [sa], t is [sa]

Respuestas:
Compile y ejecute 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 saPuede ver que la "ch" fue copiada por
memcpy(), pero nostrcpy().fuente
printf("%2.2x ", *p);¿por qué limitó printf a 2.2? Además, no veo ningún punto ... Segundo:printf("%c", *p ? *p : ' ');¿qué es lo que realmente comprueba esta prueba? Si*p? ¡Gracias de antemano por su respuesta!*pprueba significa: "si aciertas un nulo, imprime un espacio".strcpyse detiene cuando encuentra un carácter NUL ('\0'),memcpyno lo hace. No ve el efecto aquí, ya que%sen printf también se detiene en NUL.fuente
pyten algo (todos los espacios en blanco, por ejemplo), luego, después de copiar, compararp[3]cont[3]. Elstrcpyno fue más alláp[2], donde encontró el carácter nulo, peromemcpycomo se indicó copió cinco caracteres.strcpytermina cuando se encuentra el terminador nulo de la cadena de origen.memcpyrequiere que se pase un parámetro de tamaño. En el caso que presentó, laprintfdeclaración se detiene después de que se encuentra el terminador nulo para ambas matrices de caracteres, sin embargo, también encontrarát[3]yt[4]habrá copiado datos en ellas.fuente
strcpycopia 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++));donde como
memcpycopia datos (no caracteres) desde el origen al destino del tamaño dado n, independientemente de los datos en el origen.memcpydebe usarse si sabe bien que la fuente contiene otro carácter. para datos encriptados o datos binarios, memcpy es la forma ideal de hacerlo.strcpyestá en desuso, así que usestrncpy.fuente
Debido al carácter nulo en su
scadena,printfno mostrará nada más allá de eso. La diferencia entrepytestará en los caracteres 4 y 5.pno tendrá ninguno (serán basura) yttendrá el'c'y'h'.fuente
strcpydetiene cuando encuentra unaNULLo'\0'memcpysuele ser más eficiente questrcpy, que siempre escanea los datos que copiafuente
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á.fuente
El problema con su programa de prueba es que
printf()deja de insertar el argumento%scuando encuentra una terminación nula\0. Entonces, en su salida probablemente no se haya dado cuenta, quememcpy()copió los caracterescyhtambién.He visto en GNU
glibc-2.24que (para x86)strcpy()solo llamamemcpy(dest, src, strlen(src) + 1).fuente
printf("%s",...)deja de imprimir los datos cuando se encuentra un valor nulo, por lo que ambas salidas son iguales.El siguiente código diferencia entre
strcpyymemcpy:#include<stdio.h> #include<string.h> int main() { char s[5]={'s','a','\0','c','h'}; char p[5]; char t[5]; int i; strcpy(p,s); memcpy(t,s,5); for(i=0;i<5;i++) printf("%c",p[i]); printf("\n"); for(i=0;i<5;i++) printf("%c",t[i]); return 0; }fuente