Namespaces
Variants

strcpy, strcpy_s

De es.cppreference.net
< c | cadena | byte
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:
  • src o dest es un puntero nulo
  • destsz es cero o mayor que RSIZE_MAX
  • destsz es menor o igual strnlen_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 dest
2) 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

  • strlcpy trunca la cadena origen para que quepa en el destino (lo cual es un riesgo de seguridad)
  • strlcpy no realiza todas las verificaciones en tiempo de ejecución que strcpy_s hace
  • strlcpy no 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

#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

copia una cierta cantidad de caracteres de una cadena a otra
(función)
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)