strncat programming c memcpy strncpy

programming - ¿Diferencia entre strncpy y memcpy?



string h c++> (5)

¿Cómo puedo acceder a s[7] en s ?

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 debo 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 */


Cuando tengas:

char s[10] = "qwerty";

esto es lo que contiene esa matriz:

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'' al final de su cadena, eso 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 (un terminador nulo). Si bien no es necesario en este caso, en general, tenga en cuenta que debe hacer que sus cadenas terminen en cero. p.ej

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 nulo. Como el resto de s no está inicializado, necesitamos agregar un terminador nulo con s[7] = 0;


Está obteniendo la consulta de salida porque el índice 7 es incorrecto (las matrices se indexan 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á efecto.

Dos cosas que necesitas arreglar:

  1. Cambia el 7 en s[7] a 6
  2. Agregue un terminador nulo en s[7]

El resultado será:

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

Original no funciona y trabajo fijo .

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 una antes de n . Así que lo que quieres usar aquí es strncpy , pero ten mucho cuidado con el gran PERO.


Otros han señalado sus problemas de terminación nula. memcpy 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 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).


Para hacer "qwertyA" necesitas configurar s[6] = ''A'' y s[7]=''/0''

Las cadenas se indexan desde 0, por lo que s[0] == ''q'' , y deben estar terminadas en nulo.


Strncpy copiará hasta NULL incluso si especificó el número de bytes para copiar, pero memcpy copiará hasta un número específico de bytes.

La declaración de printf se imprimirá hasta NULL, por lo que intentará imprimir un solo charater, se mostrará,

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

SALIDA

7 7