strcat, strcat_s
|
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) |
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.
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.
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:
-
-
srcodestes un puntero nulo -
destszes cero o mayor que RSIZE_MAX -
no hay terminador nulo en los primeros
destszbytes dedest -
ocurriría truncamiento (el espacio disponible al final de
destno cabría para cada carácter, incluyendo el terminador nulo, desrc) - ocurriría superposición entre las cadenas de origen y destino
-
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_ssolo 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
dest
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
-
strlcattrunca la cadena fuente para que quepa en el destino -
strlcatno realiza todas las comprobaciones en tiempo de ejecución questrcat_shace -
strlcatno 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
|
(C11)
|
concatena una cantidad determinada 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
|
|