strncat, strncat_s
|
Definido en el encabezado
<string.h>
|
||
| (1) | ||
|
char
*
strncat
(
char
*
dest,
const
char
*
src,
size_t
count
)
;
|
(hasta C99) | |
|
char
*
strncat
(
char
*
restrict
dest,
const
char
*
restrict
src,
size_t
count
)
;
|
(desde C99) | |
|
errno_t strncat_s
(
char
*
restrict
dest, rsize_t destsz,
const char * restrict src, rsize_t count ) ; |
(2) | (desde C11) |
count
caracteres del array de caracteres apuntado por
src
, deteniéndose si se encuentra el carácter nulo, 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
. El carácter nulo terminador siempre se anexa al final (por lo que el número máximo de bytes que la función puede escribir es
count
+
1
).
dest
y los primeros
count
caracteres de
src
, más el carácter nulo terminador. El comportamiento es indefinido si los objetos fuente y destino se superponen. El comportamiento es indefinido si
dest
no es un puntero a una cadena de bytes terminada en nulo o
src
no es un puntero a un array de caracteres,
destsz
) 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 -
destszocountes cero o mayor que RSIZE_MAX -
no hay carácter nulo en los primeros
destszbytes dedest -
ocurriría truncamiento:
counto la longitud desrc, el que sea menor, excede el espacio disponible entre el terminador nulo dedestydestsz. - ocurriría superposición entre las cadenas de origen y destino
-
dest
<
strnlen
(
dest,destsz
)
+
strnlen
(
src,count
)
+
1
<
destsz
; en otras palabras, un valor erróneo de
destsz
no expone el desbordamiento de búfer inminente. El comportamiento es indefinido si el tamaño del array de caracteres apuntado por
src
<
strnlen
(
src,count
)
<
destsz
; en otras palabras, un valor erróneo de
count
no expone el desbordamiento de búfer inminente.
-
Como con todas las funciones con verificación de límites,
strncat_ssolo 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 a la cadena de bytes terminada en nulo a la que se va a añadir |
| src | - | puntero al array de caracteres desde el que se va a copiar |
| count | - | número máximo de caracteres a copiar |
| destsz | - | 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
strncat
necesita buscar el final de
dest
en cada llamada, es ineficiente concatenar muchas cadenas en una usando
strncat
.
Aunque el truncamiento para ajustarse al búfer de destino es un riesgo de seguridad y, por lo tanto, una violación de las restricciones en tiempo de ejecución para
strncat_s
, es posible obtener el comportamiento de truncamiento especificando
count
igual al tamaño del array de destino menos uno: copiará los primeros
count
bytes y añadirá el terminador nulo como siempre:
strncat_s
(
dst,
sizeof
dst, src,
(
sizeof
dst
)
-
strnlen_s
(
dst,
sizeof
dst
)
-
1
)
;
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); strncat(str, " Goodbye World!", 3); puts(str); #ifdef __STDC_LIB_EXT1__ set_constraint_handler_s(ignore_handler_s); char s1[100] = "good"; char s5[1000] = "bye"; int r1 = strncat_s(s1, 100, s5, 1000); // r1 es 0, s1 contiene "goodbye\0" printf("s1 = %s, r1 = %d\n", s1, r1); char s2[6] = "hello"; int r2 = strncat_s(s2, 6, "", 1); // r2 es 0, s2 contiene "hello\0" printf("s2 = %s, r2 = %d\n", s2, r2); char s3[6] = "hello"; int r3 = strncat_s(s3, 6, "X", 2); // r3 es distinto de cero, s3 contiene "\0" printf("s3 = %s, r3 = %d\n", s3, r3); // el idiom de truncamiento de strncat_s: char s4[7] = "abc"; int r4 = strncat_s(s4, 7, "defghijklmn", 3); // r4 es 0, s4 contiene "abcdef\0" printf("s4 = %s, r4 = %d\n", s4, r4); #endif }
Salida posible:
Hello World! Go s1 = goodbye, r1 = 0 s2 = hello, r2 = 0 s3 = , r3 = 22 s4 = abcdef, r4 = 0
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
-
- 7.26.3.2 La función strncat (p: 379)
-
- K.3.7.2.2 La función strncat_s (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
-
- 7.24.3.2 La función strncat (p: 265-266)
-
- K.3.7.2.2 La función strncat_s (p: 449-450)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 7.24.3.2 La función strncat (p: 364-365)
-
- K.3.7.2.2 La función strncat_s (p: 618-620)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 7.21.3.2 La función strncat (p: 327-328)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 4.11.3.2 La función strncat
Véase también
|
(C11)
|
concatena 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
strncat
|
|