2011-01-04 19 views
13

¿Cómo puedo acceder a s[7] en s?Diferencia entre strncpy y memcpy?

No observé ninguna diferencia entre strncpy y memcpy. Si quiero imprimir la salida s, junto con s[7] (como qwertyA), ¿cuáles son los cambios que tengo que hacer en el siguiente código:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    char s[10] = "qwerty", str[10], str1[10]; 
    s[7] = 'A'; 
    printf("%s\n",s); 
    strncpy(str,s,8); 
    printf("%s\n",str); 
    memcpy(str1,s,8); 
    printf("%s\n",str1); 
    return 0; 
} 
/* 
O/P 
qwerty 
qwerty 
qwerty 
*/ 
+1

intentar cambiar '' memcpy' y en strncpy' su código anterior Entonces experimenta la diferencia. –

+0

Otra diferencia es la comprobación de tipo y el tipo devuelto. Importante en otros casos, no aquí. – chux

Respuesta

6

vas a encontrar la salida querty porque el índice 7 es incorrecta (las matrices están indexadas desde 0, no 1). Hay un null-terminator en el índice 6 para señalar el final de la cadena, y lo que venga después no tendrá ningún efecto.

dos cosas que hay que corregir:

  1. Cambiar el 7 en s[7] a 6
  2. Añadir un terminador nulo en s[7]

El resultado será:

char s[10] = "qwerty"; 
s[6] = 'A'; 
s[7] = 0; 

Original not working y fixed working.

En cuanto a la pregunta de strncpy versus memcpy, la diferencia es que strncpy agrega un terminador nulo para usted. PERO, solo si la cadena fuente tiene uno antes de n. Así que strncpy es lo que quieres usar aquí, pero ten mucho cuidado con los grandes PERO.

2

Para hacer "qwertyA" que hay que configurar s[6] = 'A' y s[7]='\0'

cadenas son indexados de 0, por lo que s[0] == 'q', y que necesitan para ser terminada nula.

+0

No debería cambiar s [7] por s [6]. Si establecemos s [6] como 'A', obtendremos el resultado deseado. – user559208

+3

@usuario, entonces ¿está diciendo que * no * quiere el resultado deseado? O_o –

+0

@ user559208: cuando marcog escribió "change's [6]' to's [7] '" Creo que en realidad quiso decir en lugar de escribir s [7], escribir s [6]. Además, no te olvides de la terminación nula de la cadena (configuración 's [7]' a '0' o' '\ 0'') porque eso ayudará a evitar que los errores de desbordamiento entren sigilosamente. –

20

Otros han señalado sus problemas de terminación nula. Debe comprender la terminación nula antes de comprender la diferencia entre memcpy y strncpy.

La diferencia es que memcpy copiará todos los N caracteres que solicite, mientras que strncpy se copiará hasta el primer terminador nulo inclusive, o N caracteres, el que sea menor. (Si copia menos de N caracteres, rellenará el resto con caracteres nulos.)

+6

También hay otra diferencia, strncpy llenará el resto del espacio con 0. p. si haces 'strncpy (a, b, 255);' y a tiene 10 long, strncpy copiará esos 10 caracteres y rellenará los 240 caracteres restantes con 0. – nos

+0

@nos: me di cuenta de eso antes de que lo hicieras, y lo edité en . Pero gracias de cualquier manera :) –

2

Cuando se tiene:

char s[10] = "qwerty"; 

esto es lo que la matriz contiene:

 
s[0] 'q' 
s[1] 'w' 
s[2] 'e' 
s[3] 'r' 
s[4] 't' 
s[5] 'y' 
s[6] 0 
s[7] 0 
s[8] 0 
s[9] 0 

Si desea agregar una 'A' hasta el final de la cadena, que es en el índice 6 , ya que los índices de matriz comienzan en 0

s[6] = 'A'; 

Tenga en cuenta que al inicializar una matriz de esta manera, el espacio restante se establece en 0 (t un nul erminator), aunque no es necesario en este caso, generalmente tenga en cuenta que necesita hacer que sus cadenas terminen. p.

char s[10]; 
strcpy(s,"qwerty"); 
s[6] = 'A'; 
s[7] = 0; 

En el ejemplo anterior "qwerty", incluido su terminador nul se copia a s. s [6] sobrescribe ese terminador nul. Desde el resto de s no se ha inicializado tenemos que añadir un terminador nulo a nosotros mismos con s[7] = 0;

2

strncpy copiará hasta NULL incluso ha especificado el número de bytes a copiar, pero memcpy copiaremos hasta el número especificado de bytes.

sentencia printf imprime hasta NULL, por lo que tratará de imprimir una sola charater, se mostrará,

printf("\t%c %c %c\t",s[7],str[7],str1[7]); 

SALIDA

7    7