Namespaces
Variants

strcpy, strcpy_s

From cppreference.net
< c ‎ | string ‎ | byte
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_s solo 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

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

#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

copia una cantidad determinada 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)
(dynamic memory TR)
asigna una copia de una cadena
(función)