Programación en C

Cómo usar Strcpy () en lenguaje C?

Cómo usar Strcpy () en lenguaje C?
En este artículo, aprenderemos 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 cadenas en el lenguaje de programación C. Hay varios archivos de encabezado estándar en 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 biblioteca proporcionada por "string.h ”.

Sintaxis:

char * strcpy (char * ubicación_destino, const char * cadena_origen);

Entendiendo strcpy ():

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

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

El punto importante a tener en cuenta 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 mayor que la cadena de origen, es completamente responsabilidad del programador.

Ejemplos:

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

  1. strcpy () - Funcionamiento normal (ejemplo1.C)
  2. strcpy () - Caso-1 (ejemplo2.C)
  3. strcpy () - Caso-2 (ejemplo3.C)
  4. strcpy () - Caso-3 (ejemplo4.C)
  5. strcpy () - Versión definida por el usuario (ejemplo5.C)
  6. strcpy () - Versión optimizada definida por el usuario (ejemplo6.C)

strcpy () - Funcionamiento normal (ejemplo1.C):

Este programa de ejemplo muestra cómo realizar una operación de copia de cadena normal usando 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, incluido el carácter NULL) para que el destino pueda acomodar todos los caracteres del cadena fuente.

#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", source_str);
printf ("\ t Cadena de destino =% s \ n \ n", destino_str);
strcpy (destino_str, fuente_str);
printf ("Después de ejecutar la función strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ t Cadena de destino =% s \ n \ n", destino_str);
return 0;

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

La intención de este programa de ejemplo es explicar claramente lo que 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 todos los caracteres (incluido el carácter NULO) de la cadena de origen. Dos cosas que 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 strcpy () reemplazará el área de memoria más allá del límite del destino.

Veamos el programa de ejemplo. Hemos declarado source_str y lo hemos inicializado en "www.linuxhint.com ”, que tardará 18 bytes en la memoria para almacenar, incluido el carácter nulo al final de la cadena. Entonces, hemos declarado otra matriz de caracteres i.mi. destination_str con el tamaño de solo 5. Por lo tanto, 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 en la cadena de destino. De la salida a continuación, podemos ver que 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 NULL en la cadena de origen) a la dirección de destino (aunque el límite de destino exceda). Eso significa que la función strcpy () no realiza ninguna verificación de límites 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. Esta es la razón por la que la función strcpy () terminará sobrescribiendo las ubicaciones de memoria que podrían estar asignadas a una variable diferente.

En este ejemplo, podemos ver en la siguiente salida, que la función strcpy () sobrescribe la cadena fuente en sí. Los programadores siempre deben tener cuidado con este 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", source_str);
printf ("\ t Cadena de destino =% s \ n \ n", destino_str);
strcpy (destino_str, fuente_str);
printf ("Después de ejecutar la función strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ t Cadena de destino =% 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]);
return 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 está inicializada con algún valor. En este ejemplo, hemos inicializado:

  • source_str a "www.linuxhint.com ”[tamaño = 17 + 1 = 18]
  • destination_str a "I_AM_A_DESTINATION_STRING" [tamaño = 25 + 1 = 26]

La función strcpy () copiará los 17 caracteres y el carácter NULL de 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 el bucle for 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. Es por eso que vemos la última salida como:

"www.linuxhint.com_STRING ”.

#incluir
#incluir
/ * Este programa ilustra la situación cuando:
tamaño de la cadena de destino> tamaño de la 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 que 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", source_str);
printf ("\ t Cadena de destino =% s \ n \ n", destino_str);
strcpy (destino_str, fuente_str);
printf ("Después de ejecutar la función strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ t Cadena de destino =% s \ n \ n", destino_str);
/ * imprime la cadena de destino usando el bucle for * /
printf ("Imprime 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");
return 0;

strcpy () - Caso-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 provocará un comportamiento indefinido y, finalmente, 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", source_str);
/ * Nunca llame a strcpy () con una cadena literal como destino.
El programa se bloqueará.
* /
strcpy ("destino_str", fuente_str);
printf ("Después de ejecutar la función strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
return 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 encontrar '\ 0'.* /

* dest = * src; / * Copiar el carácter de origen al destino * /
src ++; / * Incremento del puntero de fuente * /
dest ++; / * Incrementar el puntero de destino * /

* 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", source_str);
printf ("\ t Cadena de destino =% s \ n \ n", destino_str);
/ * Llamando 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", source_str);
printf ("\ t Cadena de destino =% s \ n \ n", destino_str);
return 0;

strcpy () - Versión optimizada definida por el usuario (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", source_str);
printf ("\ t Cadena de destino =% s \ n \ n", destino_str);
/ * Llamando 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", source_str);
printf ("\ t Cadena de destino =% s \ n \ n", destino_str);
return 0;

Conclusión:

La función strcpy () es una función de biblioteca muy popular y útil para realizar la operación de copia de cadenas en el lenguaje de programación C. Esto se utiliza principalmente para copiar la cadena de una ubicación a otra. 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 provocar un error de software grave si se ignora. Siempre es responsabilidad del programador asegurarse de que la matriz de destino tenga suficiente espacio para contener todos los caracteres de la cadena de origen, incluido el carácter NULL.

Los mejores juegos para jugar con el seguimiento de manos
Oculus Quest presentó recientemente la gran idea del seguimiento manual sin controladores. Con un número cada vez mayor de juegos y actividades que ej...
Cómo mostrar la superposición de OSD en aplicaciones y juegos de Linux en pantalla completa
Jugar juegos en pantalla completa o usar aplicaciones en modo de pantalla completa sin distracciones puede aislarlo de la información relevante del si...
Las 5 mejores cartas de captura de juegos
Todos hemos visto y amado la transmisión de juegos en YouTube. PewDiePie, Jakesepticye y Markiplier son solo algunos de los mejores jugadores que han ...