Namespaces
Variants

strcat, strcat_s

From cppreference.net
< c ‎ | string ‎ | byte
Definido en el encabezado <string.h>
(1)
char * strcat ( char * dest, const char * src ) ;
(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) Añade 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 está terminada en nulo.
El comportamiento es indefinido si el array de destino no es lo suficientemente grande para los contenidos de ambos src y dest y el carácter nulo terminador. El comportamiento es indefinido si las cadenas se superponen. El comportamiento es indefinido 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 array 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 constraint handler actualmente instalada:
  • src o dest es un puntero nulo
  • destsz es cero o mayor que RSIZE_MAX
  • no hay terminador nulo en los primeros destsz bytes de dest
  • ocurriría truncamiento (el espacio disponible al final de dest no cabría para cada carácter, incluyendo el terminador nulo, de src )
  • 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 < 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 está garantizada para estar disponible si __STDC_LIB_EXT1__ está definido por la implementación y si el usuario define __STDC_WANT_LIB_EXT1__ a la constante entera 1 antes de incluir <string.h> .

Contenidos

Parámetros

dest - puntero a la cadena de bytes terminada en nulo a la que se va a añadir
src - puntero a la cadena de bytes terminada en nulo desde la que se va a 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) 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

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

strcat_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 strcat_s es similar a la función BSD strlcat , excepto que

  • strlcat trunca la cadena fuente para que quepa en el destino
  • strlcat no realiza todas las comprobaciones en tiempo de ejecución que strcat_s hace
  • strlcat no hace evidentes los fallos estableciendo el destino como 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 utilizando la versión con verificación de límites strncat_s en su lugar.

Ejemplo

#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h> 
#include <stdio.h>
#include <stdlib.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
}

Salida posible:

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

Referencias

  • 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 cantidad determinada de caracteres de dos cadenas
(función)
copia una cadena a otra
(función)
(C23)
copia un búfer a otro, deteniéndose después del delimitador especificado
(función)