strcpy, strcpy_s
De es.cppreference.net
| Definido en el encabezado <string.h>
|
||
char* strcpy( char* dest, const char* src );
|
(1) | (hasta C99) |
char* strcpy( char* restrict dest, const char* restrict src );
|
(desde C99) | |
errno_t strcpy_s( char* restrict dest, rsize_t destsz, const char* restrict src );
|
(2) | (desde C11) |
1) Copia la cadena de bytes terminada en nulo apuntada por
src, incluyendo el terminador nulo, al arreglo de caracteres cuyo primer elemento es apuntado por dest. El comportamiento no está definido si el arreglo
dest no es suficientemente grande. El comportamiento no está definido si las cadenas se superponen. El comportamiento no está definido si dest no es un puntero a un arreglo de caracteres o src no es un puntero a una cadena de bytes terminada en nulo.2) Igual que (1), excepto que puede sobrescribir el resto del arreglo destino con valores no especificados y que los siguientes errores se detectan en tiempo de ejecución y llaman a la función manejador de restricciones instalada actualmente:
srcodestes un puntero nulodestszes cero o mayor queRSIZE_MAXdestszes menor o igualstrnlen_s(src, destsz); en otras palabras, ocurriría truncamiento- ocurriría superposición entre las cadenas origen y destino
El comportamiento no está definido si el tamaño del arreglo de caracteres apuntado por
dest <= strnlen_s(src, destsz) < destsz; en otras palabras, un valor erróneo de destsz no expone el desbordamiento de búfer inminente. Como con todas las funciones con verificación de límites,
strcpy_s solo se garantiza que esté disponible si __STDC_LIB_EXT1__ está definido por la implementación y si el usuario define __STDC_WANT_LIB_EXT1__ como la constante entera 1 antes de incluir <string.h>.Parámetros
| dest | - | puntero al arreglo de caracteres donde escribir |
| src | - | puntero a la cadena de bytes terminada en nulo a copiar |
| destsz | - | número máximo de caracteres a escribir, típicamente el tamaño del búfer destino |
Valor de retorno
1) devuelve una copia de
dest2) devuelve cero en éxito, devuelve distinto de cero en error. Además, en error, escribe cero en
dest[0] (a menos que dest sea un puntero nulo o destsz sea cero o mayor que RSIZE_MAX).Notas
strcpy_s se permite sobrescribir el arreglo destino desde el último carácter escrito hasta destsz para mejorar la eficiencia: puede copiar en bloques de múltiples bytes y luego buscar bytes nulos.
La función strcpy_s es similar a la función BSD strlcpy, excepto que
strlcpytrunca la cadena origen para que quepa en el destino (lo cual es un riesgo de seguridad)strlcpyno realiza todas las verificaciones en tiempo de ejecución questrcpy_shacestrlcpyno hace evidentes los fallos estableciendo el destino a una cadena nula o llamando a un manejador si la llamada falla.
Aunque strcpy_s prohíbe el truncamiento debido a riesgos potenciales de seguridad, es posible truncar una cadena usando la versión con verificación de límites de strncpy en su lugar.
Ejemplo
Ejecutar este código
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
const char* src = "Take the test.";
// src[0] = 'M' ; // this would be undefined behavior
char dst[strlen(src) + 1]; // +1 to accommodate for the null terminator
strcpy(dst, src);
dst[0] = 'M'; // OK
printf("src = %s\ndst = %s\n", src, dst);
#ifdef __STDC_LIB_EXT1__
set_constraint_handler_s(ignore_handler_s);
int r = strcpy_s(dst, sizeof dst, src);
printf("dst = \"%s\", r = %d\n", dst, r);
r = strcpy_s(dst, sizeof dst, "Take even more tests.");
printf("dst = \"%s\", r = %d\n", dst, r);
#endif
}
Posible salida:
src = Take the test.
dst = Make the test.
dst = "Take the test.", r = 0
dst = "", r = 22
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
- 7.24.2.3 La función strcpy (p: TBD)
- K.3.7.1.3 La función strcpy_s (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
- 7.24.2.3 La función strcpy (p: 264-265)
- K.3.7.1.3 La función strcpy_s (p: 447)
- Estándar C11 (ISO/IEC 9899:2011):
- 7.24.2.3 La función strcpy (p: 363)
- K.3.7.1.3 La función strcpy_s (p: 615-616)
- Estándar C99 (ISO/IEC 9899:1999):
- 7.21.2.3 La función strcpy (p: 326)
- Estándar C89/C90 (ISO/IEC 9899:1990):
- 4.11.2.3 La función strcpy
Véase también
(C11) |
copia una cierta cantidad de caracteres de una cadena a otra (función) |
(C11) |
copia un búfer a otro (función) |
(C95)(C11) |
copia una cadena ancha a otra (función) |
(memoria dinámica TR) |
asigna una copia de una cadena (función) |
Documentación de C++ para strcpy
| |