Cómo usar strcpy en lenguaje C?

Cómo usar strcpy en lenguaje C?
En este artículo, vamos a aprender sobre la función strcpy () en el lenguaje de programación C. La función strcpy () es una función de biblioteca estándar muy popular para realizar la operación de copia de cadena en el lenguaje de programación C. Hay varios archivos de encabezado estándar en el lenguaje de programación C para realizar operaciones estándar. La cuerda.H "es uno de esos archivos de encabezado, que proporciona varias funciones de biblioteca estándar para realizar operaciones de cadena. La función "strcpy ()" es una de las funciones de la biblioteca proporcionadas por "cadena.H ".

Sintaxis:

char* strcpy (char* destination_location, const char* source_string);

Comprender strcpy ():

El único propósito de la función strcpy () es copiar una cadena de origen a destino. Ahora, nos permita ver la sintaxis anterior de la función strcpy (). La función strcpy () es capaz de aceptar dos parámetros -

  • Char * Destino
  • const char * fuente

La fuente es una constante aquí para garantizar que la función strcpy () no pueda cambiar la cadena de origen. La función strcpy () copia todos los caracteres (incluido el carácter nulo al final de la cadena) desde la cadena de origen al destino. Una vez que la operación de copia está completa desde el origen hasta el destino, la función strcpy () devuelve la dirección del destino de nuevo a la función de llamadas.

El punto importante a notar aquí es que la función strcpy () no agrega la cadena de origen con la cadena de destino. Más bien reemplaza el contenido del destino con el contenido de la cadena de origen.

Además, la función strcpy () no realiza ninguna verificación para garantizar que el tamaño del destino sea más que la cadena de origen, es completamente responsabilidad del programador.

Ejemplos:

Ahora, veremos varios ejemplos para comprender la función strcpy ():

  1. strcpy () - operación normal (ejemplo1.C)
  2. strcpy () - caso -1 (ejemplo2.C)
  3. strcpy () - caso -2 (ejemplo3.C)
  4. strcpy () - Case -3 (Ejemplo4.C)
  5. strcpy () - Versión definida por el usuario (ejemplo5.C)
  6. strcpy () - Versión definida por el usuario optimizada (ejemplo6.C)

strcpy () - operación normal (ejemplo1.C):

Este programa de ejemplo muestra cómo realizar una operación de copia de cadena normal utilizando la función strcpy () en el lenguaje de programación C. Tenga en cuenta que la longitud de la cadena de destino es 30 (Char Destination_str [30];), que es mayor que la longitud de la cadena de origen (la longitud es 18 incluyendo el carácter nulo) para que el destino pueda acomodar a todos los caracteres del cadena de origen.

#incluir
#incluir
int main ()

char source_str [] = "www.Linuxhint.com ";
char Destination_str [30];
printf ("antes de llamar a la función strcpy (): \ n \ n");
printf ("\ tsource string = %s \ n", fuente_str);
printf ("\ tDestination String = %s \ n \ n", destino_str);
strcpy (destino_str, fuente_str);
printf ("después de ejecutar strcpy () función: \ n \ n");
printf ("\ tsource string = %s \ n", fuente_str);
printf ("\ tDestination String = %s \ n \ n", destino_str);
regresar 0;

strcpy () - caso -1 (ejemplo2.C):

La intención de este programa de ejemplo es explicar claramente qué sucede cuando la longitud de la cadena de destino es menor que la longitud de la cadena de origen. En tales casos, la ubicación de destino no tendrá suficientes espacios/bytes para acomodar a todos los caracteres (incluido el carácter nulo) de la cadena de origen. Dos cosas, siempre debes tener en cuenta:

  1. La función strcpy () no verificará si el destino tiene suficiente espacio.
  2. Esto podría ser peligroso en el software integrado porque el strcpy () reemplazará el área de memoria más allá del límite del destino.

Veamos el programa de ejemplo. Hemos declarado fuente_str y lo inicializamos a "www.Linuxhint.com ”, que tomará 18 bytes en la memoria para almacenar, incluido el carácter nulo al final de la cadena. Entonces, hemos declarado otra matriz de personajes i.mi. Destino_str con el tamaño de solo 5. Entonces, el Destination_STR no puede contener la cadena de origen con un tamaño total de 18 bytes.

Pero, aún así, estamos llamando a la función strcpy () para copiar la cadena de origen a la cadena de destino. De la siguiente salida, podemos ver que el strcpy () no se quejó en absoluto. En este caso, la función strcpy () comenzará a copiar el carácter de la cadena de origen (hasta que encuentre el carácter nulo en la cadena de origen) a la dirección de destino (a pesar de que el límite de destino excede). Eso significa que la función strcpy () no realiza ninguna verificación de límite para la matriz de destino. Eventualmente, la función strcpy () sobrescribirá las direcciones de memoria que no están asignadas a la matriz de destino. Es por eso que la función strcpy () terminará sobrescribiendo las ubicaciones de memoria que podrían asignarse a una variable diferente.

En este ejemplo, podemos ver en la siguiente salida, que la función strcpy () sobrescribe la cadena de origen en sí misma. Los programadores siempre deben tener cuidado con ese comportamiento.

#incluir
#incluir
int main ()

char source_str [] = "www.Linuxhint.com ";
char Destination_str [5];
printf ("antes de llamar a la función strcpy (): \ n \ n");
printf ("\ tsource string = %s \ n", fuente_str);
printf ("\ tDestination String = %s \ n \ n", destino_str);
strcpy (destino_str, fuente_str);
printf ("después de ejecutar strcpy () función: \ n \ n");
printf ("\ tsource string = %s \ n", fuente_str);
printf ("\ tDestination String = %s \ n \ n", destino_str);
// printf ("dirección de origen = %u (0x %x) \ n", & source_str [0], & source_str [0]);
// printf ("Dirección de destino = %u (0x %x) \ n", & Destination_str [0], & Destination_str [0]);
regresar 0;

strcpy () - caso -2 (ejemplo3.C):

Este programa ilustra la situación cuando el tamaño de la cadena de destino es mayor que el tamaño de la cadena de origen y la cadena de destino ya se inicializan con algún valor. En este ejemplo, hemos inicializado:

  • Source_STR a "www.Linuxhint.com ”[tamaño = 17+1 = 18]
  • Destino_str a "i_am_a_destination_string" [size = 25+1 = 26]

La función strcpy () copiará los 17 caracteres y el carácter nulo desde la cadena de origen a la cadena de destino. Pero, no reemplazará/cambiará los bytes restantes (byte 19 a 26, uno basado) en la matriz de destino. Hemos utilizado para el bucle para iterar sobre la matriz de destino e imprimir la matriz completa para demostrar que los bytes-19 a 26 no han cambiado en la matriz de destino. Por eso vemos la última salida como:

"www.Linuxhint.com_string ".

#incluir
#incluir
/* Este programa ilustra la situación cuando:
Tamaño de cadena de destino> Tamaño de cadena de origen
y ejecutamos la función strcpy () para copiar la
Cadena de origen al destino.
Nota: El tamaño de la cadena de destino siempre debe
ser mayor o igual a la cadena de origen.
*/
int main ()

char source_str [] = "www.Linuxhint.com ";
Char Destination_str [26] = "i_am_a_destination_string";
printf ("antes de llamar a la función strcpy (): \ n \ n");
printf ("\ tsource string = %s \ n", fuente_str);
printf ("\ tDestination String = %s \ n \ n", destino_str);
strcpy (destino_str, fuente_str);
printf ("después de ejecutar strcpy () función: \ n \ n");
printf ("\ tsource string = %s \ n", fuente_str);
printf ("\ tDestination String = %s \ n \ n", destino_str);
/* Imprimir cadena de destino usando para bucle*/
printf ("Imprima la cadena de destino Char por char: \ n \ n");
printf ("\ tDestination String =");
para (int i = 0; i<25;i++)

printf ("%c", destino_str [i]);

printf ("\ n \ n");
regresar 0;

strcpy () - Case -3 (Ejemplo4.C):

Hemos considerado este programa como un ejemplo para mostrar que nunca debemos llamar a strcpy () con una cadena literal como destino. Esto causará un comportamiento indefinido y eventualmente, el programa se bloqueará.

#incluir
#incluir
int main ()

char source_str [] = "www.Linuxhint.com ";
printf ("antes de llamar a la función strcpy (): \ n \ n");
printf ("\ tsource string = %s \ n", fuente_str);
/* Nunca llame strcpy () con cadena literal como destino.
El programa se bloqueará.
*/
strcpy ("Destino_str", fuente_str);
printf ("después de ejecutar strcpy () función: \ n \ n");
printf ("\ tsource string = %s \ n", fuente_str);
regresar 0;

strcpy () - Versión definida por el usuario (ejemplo5.C):

En este programa de ejemplo, hemos mostrado cómo escribir una versión definida por el usuario de la función strcpy ().

#incluir
char * strcpy_user_defined (char * dest, const char * src);
/ * Versión definida por el usuario de la función strcpy () */
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
mientras (*src != '\ 0') /* iterar hasta que se encuentre '\ 0'.*/

*dest = *src; / * Copiar Fuente Char al destino */
src ++; / * Puntero de fuente de incremento */
Dest ++; / * Puntero de destino de incremento */

*dest = '\ 0'; /* Insertar '\ 0' en el destino explícitamente*/
return Dest_Backup;

int main ()

char source_str [] = "www.Linuxhint.com ";
char Destination_str [30];
printf ("Antes de llamar a la función de copia de cadena definida por el usuario: \ n \ n");
printf ("\ tsource string = %s \ n", fuente_str);
printf ("\ tDestination String = %s \ n \ n", destino_str);
/ * Llamar a la función de copia de cadena definida por el usuario */
strcpy_user_defined (destino_str, fuente_str);
printf ("Después de ejecutar la función de copia de cadena definida por el usuario: \ n \ n");
printf ("\ tsource string = %s \ n", fuente_str);
printf ("\ tDestination String = %s \ n \ n", destino_str);
regresar 0;

strcpy () - Versión definida por el usuario optimizada (ejemplo6.C):

Ahora, en este programa de ejemplo, vamos a optimizar la versión definida por el usuario de strcpy ().

#incluir
char * strcpy_user_defined (char * dest, const char * src);
/ * Versión optimizada de la función Strcpy () definida por el usuario */
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
while ( *dest ++ = *src ++)
;
return Dest_Backup;

int main ()

char source_str [] = "www.Linuxhint.com ";
char Destination_str [30];
printf ("Antes de llamar a la función de copia de cadena definida por el usuario: \ n \ n");
printf ("\ tsource string = %s \ n", fuente_str);
printf ("\ tDestination String = %s \ n \ n", destino_str);
/ * Llamar a la función de copia de cadena definida por el usuario */
strcpy_user_defined (destino_str, fuente_str);
printf ("Después de ejecutar la función de copia de cadena definida por el usuario: \ n \ n");
printf ("\ tsource string = %s \ n", fuente_str);
printf ("\ tDestination String = %s \ n \ n", destino_str);
regresar 0;

Conclusión:

La función strcpy () es una función de biblioteca muy popular y práctica para realizar la operación de copia de cadena en el lenguaje de programación C. Esto se usa principalmente para copiar la cadena de una ubicación a otra ubicación. Sin embargo, queremos reiterar el hecho de que la función strcpy () no realiza la verificación de límites para la matriz de destino, lo que podría conducir a un error de software serio si se ignora. Siempre es responsabilidad del programador asegurarse de que la matriz de destino tenga suficiente espacio para mantener a todos los caracteres de la cadena de origen, incluido el carácter nulo.