Namespaces
Variants

strtok, strtok_s

From cppreference.net
< c ‎ | string ‎ | byte
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.

1) Una secuencia de llamadas a 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.
Cada llamada en la secuencia busca en el objetivo de búsqueda el primer carácter que no está contenido en la cadena separadora apuntada por delim , la cadena separadora puede ser diferente en cada llamada.
  • 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. strtok luego 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.
Si str o delim no es un puntero a una cadena de bytes terminada en nulo, el comportamiento es indefinido.
2) Igual que (1) , excepto por las siguientes diferencias:
  • 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.
Si tanto str apunta a un arreglo de caracteres que carece del carácter nulo y strmax apunta a un valor que es mayor que el tamaño de ese arreglo de caracteres, el comportamiento es indefinido.
Como con todas las funciones con verificación de límites, 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> .
  1. Aún puede formarse un token en una llamada posterior con una cadena separadora diferente.
  2. 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

1) Devuelve un puntero al primer carácter del siguiente token, o un puntero nulo si no hay ningún token.
2) Devuelve un puntero al primer carácter del siguiente token, o un puntero nulo si no hay ningún token o hay una violación de restricción en tiempo de ejecución.

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)