Namespaces
Variants

std:: strtok

From cppreference.net
Definido en el encabezado <cstring>
char * strtok ( char * str, const char * delim ) ;

Tokeniza una cadena de bytes terminada en nulo.

Una secuencia de llamadas a std::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 subsiguientes en la secuencia. El objetivo de búsqueda está determinado por la llamada previa 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 dicho 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 dicho carácter, es el inicio del token actual. std::strtok luego busca desde allí el primer carácter que está contenido en la cadena de separadores.
    • Si no se encuentra dicho 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 dicho 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.

  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

Valor de retorno

Devuelve un puntero al primer carácter del siguiente token, o un puntero nulo si no hay ningún token.

Notas

Esta función es destructiva: escribe los ' \0 ' caracteres en los elementos de la cadena str . En particular, un string literal no puede usarse como primer argumento de std::strtok .

Cada llamada a esta función modifica una variable estática: no es seguro para hilos.

A diferencia de la mayoría de otros tokenizadores, los delimitadores en std::strtok pueden ser diferentes para cada token subsiguiente, e incluso pueden depender del contenido de los tokens anteriores.

Implementación posible

char* strtok(char* str, const char* delim)
{
    static char* buffer;
    if (str != nullptr)
        buffer = str;
    buffer += std::strspn(buffer, delim);
    if (*buffer == '\0')
        return nullptr;
    char* const tokenBegin = buffer;
    buffer += std::strcspn(buffer, delim);
    if (*buffer != '\0')
        *buffer++ = '\0';
    return tokenBegin;
}

Las implementaciones reales de bibliotecas C++ de esta función delegan en la biblioteca C, donde puede implementarse directamente (como en MUSL libc ), o en términos de su versión reentrante (como en GNU libc ).

Ejemplo

#include <cstring>
#include <iomanip>
#include <iostream>
int main() 
{
    char input[] = "one + two * (three - four)!";
    const char* delimiters = "! +- (*)";
    char* token = std::strtok(input, delimiters);
    while (token)
    {
        std::cout << std::quoted(token) << ' ';
        token = std::strtok(nullptr, delimiters);
    }
    std::cout << "\nContents of the input string now:\n\"";
    for (std::size_t n = 0; n < sizeof input; ++n)
    {
        if (const char c = input[n]; c != '\0')
            std::cout << c;
        else
            std::cout << "\\0";
    }
    std::cout << "\"\n";
}

Salida:

"one" "two" "three" "four" 
Contents of the input string now:
"one\0+ two\0* (three\0- four\0!\0"

Véase también

encuentra la primera ubicación de cualquier carácter de un conjunto de separadores
(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)
una view sobre los subrangos obtenidos al dividir otra view usando un delimitador
(plantilla de clase) (objeto adaptador de rango)