strcpy, strcpy_s
From cppreference.net
|
Definido en el encabezado
<string.h>
|
||
| (1) | ||
|
char
*
strcpy
(
char
*
dest,
const
char
*
src
)
;
|
(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 está apuntado por
dest
.
El comportamiento es indefinido si el
dest
array no es lo suficientemente grande. El comportamiento es indefinido si las cadenas se superponen. El comportamiento es indefinido si
dest
no es un puntero a un array 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 array de destino con valores no especificados y que los siguientes errores se detectan en tiempo de ejecución y llaman a la función
constraint handler
actualmente instalada:
-
- src o dest es un puntero nulo
- destsz es cero o mayor que RSIZE_MAX
- destsz es menor o igual a strnlen_s ( src, destsz ) ; en otras palabras, ocurriría truncamiento
- ocurriría superposición entre las cadenas de origen y destino
El comportamiento es indefinido si el tamaño del array de caracteres apuntado por
dest
<=
strnlen_s
(
src, destsz
)
<
destsz
; en otras palabras, un valor erróneo de
destsz
puede permitir un desbordamiento de búfer.
-
Como con todas las funciones con verificación de límites,
strcpy_ssolo está garantizada su disponibilidad 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> .
Contenidos |
Parámetros
| dest | - | puntero al array de caracteres donde escribir |
| src | - | puntero a la cadena de bytes terminada en nulo desde la cual copiar |
| destsz | - | número máximo de caracteres a escribir, normalmente el tamaño del buffer de destino |
Valor de retorno
1)
devuelve una copia de
dest
2)
retorna cero en caso de éxito, retorna distinto de cero en caso de error. Además, en caso de 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
tiene permitido sobrescribir el array de destino desde el último carácter escrito hasta
destsz
para mejorar la eficiencia: puede copiar en bloques multibyte y luego verificar bytes nulos.
La función
strcpy_s
es similar a la función BSD
strlcpy
, excepto que
-
strlcpytrunca la cadena fuente para que quepa en el destino (lo cual es un riesgo de seguridad) -
strlcpyno realiza todas las comprobaciones en tiempo de ejecución questrcpy_ssí realiza -
strlcpyno hace evidentes los fallos estableciendo el destino como una cadena nula o llamando a un manejador si la llamada falla.
Aunque
strcpy_s
prohíbe el truncamiento debido a posibles riesgos de seguridad, es posible truncar una cadena utilizando la versión con verificación de límites
strncpy_s
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' ; // esto sería comportamiento indefinido char dst[strlen(src) + 1]; // +1 para acomodar el terminador nulo 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 }
Salida posible:
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 cantidad determinada 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) |
|
(dynamic memory TR)
|
asigna una copia de una cadena
(función) |
|
Documentación de C++
para
strcpy
|
|