memcpy c++
strcpy vs. memcpy (8)
¿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 el "ch" fue copiado por memcpy()
, pero no por strcpy()
.
¿Cuál es la diferencia entre memcpy () y strcpy ()? Intenté 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]
Debido al carácter nulo en su cadena s, el printf no mostrará nada más allá de eso. La diferencia entre p y t estará en los caracteres 4 y 5. p no tendrá ninguno (será basura) y t tendrá la ''c'' y la ''h''.
El problema con su programa de prueba es que el printf()
deja de insertar el argumento en %s
, cuando encuentra una terminación nula /0
. Entonces, en su salida, probablemente no se haya dado cuenta, que memcpy()
copió los caracteres c
y h
.
He visto en GNU glibc-2.24
, que (para x86) strcpy()
simplemente llama memcpy(dest, src, strlen(src) + 1)
.
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.
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 a medida que memcpy
copia datos (no caracteres) del origen al destino de un tamaño dado n, independientemente de los datos en el origen.
memcpy
debe usar memcpy
si sabe bien que la fuente contiene otro carácter distinto del carácter. para datos encriptados o datos binarios, memcpy es la manera ideal de hacerlo.
strcpy
está en desuso, así que usa strncpy
.
strcpy
detiene cuando encuentra un valor NULL, memcpy
no. No ve el efecto aquí, ya que %s
en printf también se detiene en NULL.
strcpy
termina cuando se encuentra el terminador nulo de la cadena fuente. memcpy
requiere que se memcpy
un parámetro de tamaño. En el caso de que haya presentado, la instrucción printf
se detiene después de que se encuentra el terminador nulo para ambas matrices de caracteres, sin embargo, encontrará que t[3]
t[4]
han copiado datos en ellas.
- Diferencia de comportamiento:
strcpy
detiene cuando encuentra unNULL
o''/0''
- Diferencia de rendimiento:
memcpy
suele ser más eficiente questrcpy
, que siempre escanea los datos que copia