Sintaxis:
carbonizarse* strcpy (carbonizarse*ubicación de destino, constante carbonizarse*cadena_fuente);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:
- char * destino
- const char * fuente
La fuente es una constante aquí para asegurar 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 ():
- strcpy () - Operación normal (ejemplo1.c)
- strcpy () - Caso-1 (ejemplo2.c)
- strcpy () - Caso-2 (ejemplo3.c)
- strcpy () - Caso-3 (ejemplo4.c)
- strcpy () - Versión definida por el usuario (ejemplo5.c)
- strcpy () - Versión optimizada definida por el usuario (ejemplo6.c)
strcpy () - Operación 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 de origen.
#incluir
#incluir
En tprincipal()
{
carbonizarsesource_str[] = 'www.linuxhint.com';
carbonizarsedestino_str[30];
printf ('Antes de llamar a la función strcpy (): orte orte');
printf (' tCadena de origen =% s orte',source_str);
printf (' tCadena de destino =% s orte orte',destino_str);
strcpy (destino_str,source_str);
printf ('Después de ejecutar la función strcpy (): orte orte');
printf (' tCadena de origen =% s orte',source_str);
printf (' tCadena de destino =% s orte orte',destino_str);
regreso 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 todos los caracteres (incluido el carácter NULO) de la cadena de origen. Dos cosas que siempre debes tener en cuenta:
- La función strcpy () no comprobará si el destino tiene suficiente espacio.
- 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 inicializamos en www.linuxhint.com , que tardará 18 bytes en la memoria para almacenar, incluido el carácter nulo al final de la cadena. Luego, hemos declarado otra matriz de caracteres, es decir, 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. Es por eso 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 el resultado de abajo, que la función strcpy () sobrescribe la cadena fuente en sí. Los programadores siempre deben tener cuidado con este comportamiento.
#incluir#incluir
En tprincipal()
{
carbonizarsesource_str[] = 'www.linuxhint.com';
carbonizarsedestino_str[5];
printf ('Antes de llamar a la función strcpy (): orte orte');
printf (' tCadena de origen =% s orte',source_str);
printf (' tCadena de destino =% s orte orte',destino_str);
strcpy (destino_str,source_str);
printf ('Después de ejecutar la función strcpy (): orte orte');
printf (' tCadena de origen =% s orte',source_str);
printf (' tCadena de destino =% s orte orte',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]);
regreso 0;
}
strcpy () - Caso-2 (ejemplo3.c):
Este programa ilustra la situación en la que 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 [talla = 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:
#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.
*/
En tprincipal()
{
carbonizarsesource_str[] = 'www.linuxhint.com';
carbonizarsedestino_str[26] = 'I_AM_A_DESTINATION_STRING';
printf ('Antes de llamar a la función strcpy (): orte orte');
printf (' tCadena de origen =% s orte',source_str);
printf (' tCadena de destino =% s orte orte',destino_str);
strcpy (destino_str,source_str);
printf ('Después de ejecutar la función strcpy (): orte orte');
printf (' tCadena de origen =% s orte',source_str);
printf (' tCadena de destino =% s orte orte',destino_str);
/ * imprime la cadena de destino usando el bucle for * /
printf ('Imprime la cadena de destino char por char: orte orte');
printf (' tCadena de destino = ');
por(En tI=0;I<25;I++)
{
printf ('%c',destino_str[I]);
}
printf (' orte orte');
regreso 0;
}
strcpy () - Caso-3 (ejemplo4.c):
Hemos considerado este programa como un ejemplo para mostrar que nunca deberíamos llamar a strcpy () con una cadena literal como destino. Esto provocará un comportamiento indefinido y, finalmente, el programa se bloqueará.
#incluir#incluir
En tprincipal()
{
carbonizarsesource_str[] = 'www.linuxhint.com';
printf ('Antes de llamar a la función strcpy (): orte orte');
printf (' tCadena de origen =% s orte',source_str);
/ * Nunca llame a strcpy () con una cadena literal como destino.
El programa se bloqueará.
*/
strcpy ('destino_str',source_str);
printf ('Después de ejecutar la función strcpy (): orte orte');
printf (' tCadena de origen =% s orte',source_str);
regreso 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 ().
#incluircarbonizarse *strcpy_user_defined(carbonizarse *dest, constante carbonizarse *src);
/ * Versión definida por el usuario de la función strcpy () * /
carbonizarse *strcpy_user_defined(carbonizarse *dest, constante carbonizarse *src)
{
carbonizarse *dest_backup=dest;
tiempo(*src!= '