Namespaces
Variants

strcat, strcat_s

De es.cppreference.net
< c | cadena | byte
Definido en el encabezado <string.h>
char* strcat( char* dest, const char* src );
(1) (hasta C99)
char* strcat( char* restrict dest, const char* restrict src );
(desde C99)
errno_t strcat_s(char* restrict dest, rsize_t destsz, const char* restrict src);
(2) (desde C11)
1) Agrega una copia de la cadena de bytes terminada en nulo apuntada por src al final de la cadena de bytes terminada en nulo apuntada por dest. El carácter src[0] reemplaza el terminador nulo al final de dest. La cadena de bytes resultante termina en nulo.
El comportamiento no está definido si el arreglo de destino no es lo suficientemente grande para el contenido de ambos src y dest y el carácter nulo de terminación. El comportamiento no está definido si las cadenas se superponen. El comportamiento no está definido si dest 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 de destino (desde el último carácter escrito hasta destsz) con valores no especificados y que los siguientes errores se detectan en tiempo de ejecución y llaman a la función manejador de restricción instalada actualmente:
  • src o dest es un puntero nulo
  • destsz es cero o mayor que RSIZE_MAX
  • no hay un terminador nulo en los primeros destsz bytes de dest
  • se produciría truncamiento (el espacio disponible al final de dest no contendría todos los caracteres, incluido el terminador nulo, de src)
  • se produciría superposición entre las cadenas de origen y destino
El comportamiento no está definido si el tamaño del arreglo de caracteres apuntado por dest < strlen(dest)+strlen(src)+1 <= 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, strcat_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 a la cadena de bytes terminada en nulo a la cual añadir
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 búfer de destino

Valor de retorno

1) devuelve una copia de dest
2) devuelve cero en caso de éxito, devuelve un valor distinto de cero en caso de error. También, 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

Dado que strcat necesita buscar el final de dest en cada llamada, es ineficiente concatenar muchas cadenas en una sola usando strcat.

strcat_s puede sobrescribir el arreglo de destino desde el último carácter escrito hasta destsz para mejorar la eficiencia: puede copiar en bloques multibyte y luego verificar los bytes nulos.

La función strcat_s es similar a la función BSD strlcat, excepto que

  • strlcat trunca la cadena de origen para que quepa en el destino
  • strlcat no realiza todas las verificaciones en tiempo de ejecución que hace strcat_s
  • strlcat no hace visibles los fallos estableciendo el destino en una cadena nula o llamando a un manejador si la llamada falla.

Aunque strcat_s prohíbe el truncamiento debido a posibles riesgos de seguridad, es posible truncar una cadena usando la función con verificación de límites strncat en su lugar.

Ejemplo

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char str[50] = "Hello ";
    char str2[50] = "World!";
    strcat(str, str2);
    strcat(str, " ...");
    strcat(str, " Goodbye World!");
    puts(str);

#ifdef __STDC_LIB_EXT1__
    set_constraint_handler_s(ignore_handler_s);
    int r = strcat_s(str, sizeof str, " ... ");
    printf("str = \"%s\", r = %d\n", str, r);
    r = strcat_s(str, sizeof str, " and this is too much");
    printf("str = \"%s\", r = %d\n", str, r);
#endif
}

Posible salida:

Hello World! ... Goodbye World!
str = "Hello World! ... Goodbye World! ... ", r = 0
str = "", r = 22

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.24.3.1 La función strcat (p: TBD)
  • K.3.7.2.1 La función strcat_s (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.24.3.1 La función strcat (p: TBD)
  • K.3.7.2.1 La función strcat_s (p: TBD)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.24.3.1 La función strcat (p: 364)
  • K.3.7.2.1 La función strcat_s (p: 617-618)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.21.3.1 La función strcat (p: 327)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.11.3.1 La función strcat

Véase también

concatena una cierta cantidad de caracteres de dos cadenas
(función)
copia una cadena a otra
(función)
copia un búfer a otro, deteniéndose después del delimitador especificado
(función)