strtok, strtok_s
|
Definido en el encabezado
<string.h>
|
||
| (1) | ||
|
char
*
strtok
(
char
*
str,
const
char
*
delim
)
;
|
(hasta C99) | |
|
char
*
strtok
(
char
*
restrict
str,
const
char
*
restrict
delim
)
;
|
(desde C99) | |
|
char
*
strtok_s
(
char
*
restrict
str, rsize_t
*
restrict
strmax,
const char * restrict delim, char ** restrict ptr ) ; |
(2) | (desde C11) |
Tokeniza una cadena de bytes terminada en nulo.
strtok
divide la cadena apuntada por
str
en una secuencia de tokens, cada uno delimitado por un carácter de la cadena apuntada por
delim
. Cada llamada en la secuencia tiene un
objetivo de búsqueda
:
- Si str no es nulo, la llamada es la primera llamada en la secuencia. El objetivo de búsqueda es la cadena de bytes terminada en nulo apuntada por str .
- Si str es nulo, la llamada es una de las llamadas posteriores en la secuencia. El objetivo de búsqueda está determinado por la llamada anterior en la secuencia.
- Si no se encuentra tal carácter, entonces no hay tokens en el objetivo de búsqueda. El objetivo de búsqueda para la siguiente llamada en la secuencia permanece sin cambios. [1]
-
Si se encuentra tal carácter, es el inicio del token actual.
strtokluego busca desde allí el primer carácter que está contenido en la cadena separadora.- Si no se encuentra tal carácter, el token actual se extiende hasta el final del objetivo de búsqueda. El objetivo de búsqueda para la siguiente llamada en la secuencia es una cadena vacía. [2]
- Si se encuentra tal carácter, se sobrescribe con un carácter nulo, que termina el token actual. El objetivo de búsqueda para la siguiente llamada en la secuencia comienza desde el carácter siguiente.
- En cada llamada, escribe el número de caracteres restantes por ver en str en * strmax y escribe el estado interno del tokenizador en * ptr .
- Las llamadas subsiguientes en la secuencia deben pasar strmax y ptr con los valores almacenados por la llamada anterior.
-
Los siguientes errores se detectan en tiempo de ejecución y llaman a la función
constraint handler
actualmente instalada, sin almacenar nada en el objeto apuntado por
ptr
:
- strmax , delim , o ptr es un puntero nulo.
- * ptr es un puntero nulo para una llamada subsiguiente en la secuencia.
- * strmax es mayor que RSIZE_MAX .
- El final del token encontrado no ocurre dentro de los primeros * s1max caracteres del objetivo de búsqueda.
strtok_s
solo está garantizada su disponibilidad si
__STDC_LIB_EXT1__
está definida por la implementación y si el usuario define
__STDC_WANT_LIB_EXT1__
como la constante entera
1
antes de incluir
<string.h>
.
- ↑ Aún puede formarse un token en una llamada posterior con una cadena separadora diferente.
- ↑ No se pueden formar más tokens en llamadas posteriores.
Contenidos |
Parámetros
| str | - | puntero a la cadena de bytes terminada en nulo a tokenizar |
| delim | - | puntero a la cadena de bytes terminada en nulo que identifica delimitadores |
| strmax | - |
puntero a un objeto que inicialmente contiene el tamaño de
str
:
strtok_s
almacena el número de caracteres que quedan por examinar
|
| ptr | - |
puntero a un objeto de tipo
char
*
, que es utilizado por
strtok_s
para almacenar su estado interno
|
Valor de retorno
Nota
Esta función es destructiva: escribe los caracteres
'
\0
'
en los elementos de la cadena
str
. En particular, un literal de cadena no puede usarse como primer argumento de
strtok
.
Cada llamada a
strtok
modifica una variable estática: no es seguro para hilos.
A diferencia de la mayoría de otros tokenizadores, los delimitadores en
strtok
pueden ser diferentes para cada token subsiguiente, e incluso pueden depender del contenido de los tokens anteriores.
La función
strtok_s
difiere de la función POSIX
strtok_r
al protegerse contra el almacenamiento fuera de la cadena que se está tokenizando, y al verificar restricciones de tiempo de ejecución. La firma de Microsoft CRT
strtok_s
coincide con esta definición POSIX
strtok_r
, no con la de C11
strtok_s
.
Ejemplo
#define __STDC_WANT_LIB_EXT1__ 1 #include <stdio.h> #include <string.h> int main(void) { char input[] = "A bird came down the walk"; printf("Parsing the input string '%s'\n", input); char* token = strtok(input, " "); while (token) { puts(token); token = strtok(NULL, " "); } printf("Contents of the input string now: '"); for (size_t n = 0; n < sizeof input; ++n) input[n] ? putchar(input[n]) : fputs("\\0", stdout); puts("'"); #ifdef __STDC_LIB_EXT1__ char str[] = "A bird came down the walk"; rsize_t strmax = sizeof str; const char* delim = " "; char* next_token; printf("Parsing the input string '%s'\n", str); token = strtok_s(str, &strmax, delim, &next_token); while (token) { puts(token); token = strtok_s(NULL, &strmax, delim, &next_token); } printf("Contents of the input string now: '"); for (size_t n = 0; n < sizeof str; ++n) str[n] ? putchar(str[n]) : fputs("\\0", stdout); puts("'"); #endif }
Salida posible:
Parsing the input string 'A bird came down the walk' A bird came down the walk Contents of the input string now: 'A\0bird\0came\0down\0the\0walk\0' Parsing the input string 'A bird came down the walk' A bird came down the walk Contents of the input string now: 'A\0bird\0came\0down\0the\0walk\0'
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
-
- 7.24.5.8 La función strtok (p: TBD)
-
- K.3.7.3.1 La función strtok_s (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
-
- 7.24.5.8 La función strtok (p: TBD)
-
- K.3.7.3.1 La función strtok_s (p: TBD)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 7.24.5.8 La función strtok (p: 369-370)
-
- K.3.7.3.1 La función strtok_s (p: 620-621)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 7.21.5.8 La función strtok (p: 332-333)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 4.11.5.8 La función strtok
Véase también
|
encuentra la primera ubicación de cualquier carácter de una cadena en otra cadena
(función) |
|
|
devuelve la longitud del segmento inicial máximo que consiste
únicamente en caracteres no encontrados en otra cadena de bytes (función) |
|
|
devuelve la longitud del segmento inicial máximo que consiste
únicamente en caracteres encontrados en otra cadena de bytes (función) |
|
|
(C95)
(C11)
|
encuentra el siguiente token en una cadena ancha
(función) |
|
Documentación de C++
para
strtok
|
|