¿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 sa
Puede 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!*p
prueba significa: "si aciertas un nulo, imprime un espacio".strcpy
se detiene cuando encuentra un carácter NUL ('\0'
),memcpy
no lo hace. No ve el efecto aquí, ya que%s
en printf también se detiene en NUL.fuente
p
yt
en algo (todos los espacios en blanco, por ejemplo), luego, después de copiar, compararp[3]
cont[3]
. Elstrcpy
no fue más alláp[2]
, donde encontró el carácter nulo, peromemcpy
como se indicó copió cinco caracteres.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 presentó, laprintf
declaració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
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++));
donde como
memcpy
copia datos (no caracteres) desde el origen al destino del tamaño dado n, independientemente de los datos en el origen.memcpy
debe usarse si sabe bien que la fuente contiene otro carácter. para datos encriptados o datos binarios, memcpy es la forma ideal de hacerlo.strcpy
está en desuso, así que usestrncpy
.fuente
Debido al carácter nulo en su
s
cadena,printf
no mostrará nada más allá de eso. La diferencia entrep
yt
estará en los caracteres 4 y 5.p
no tendrá ninguno (serán basura) yt
tendrá el'c'
y'h'
.fuente
strcpy
detiene cuando encuentra unaNULL
o'\0'
memcpy
suele 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%s
cuando encuentra una terminación nula\0
. Entonces, en su salida probablemente no se haya dado cuenta, quememcpy()
copió los caracteresc
yh
también.He visto en GNU
glibc-2.24
que (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
strcpy
ymemcpy
:#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