strcat, strcat_s
De es.cppreference.net
| 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:
srcodestes un puntero nulodestszes cero o mayor que RSIZE_MAX- no hay un terminador nulo en los primeros
destszbytes dedest - se produciría truncamiento (el espacio disponible al final de
destno contendría todos los caracteres, incluido el terminador nulo, desrc) - 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
dest2) 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
strlcattrunca la cadena de origen para que quepa en el destinostrlcatno realiza todas las verificaciones en tiempo de ejecución que hacestrcat_sstrlcatno 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
Ejecutar este código
#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
(C11) |
concatena una cierta cantidad de caracteres de dos cadenas (función) |
(C11) |
copia una cadena a otra (función) |
(C23) |
copia un búfer a otro, deteniéndose después del delimitador especificado (función) |
Documentación de C++ para strcat
| |