Namespaces
Variants

std:: strtok

From cppreference.net
Défini dans l'en-tête <cstring>
char * strtok ( char * str, const char * delim ) ;

Tokenise une chaîne d'octets terminée par un caractère nul.

Une séquence d'appels à std::strtok décompose la chaîne pointée par str en une séquence de tokens, chacun étant délimité par un caractère de la chaîne pointée par delim . Chaque appel dans la séquence possède une cible de recherche  :

  • Si str n'est pas nul, l'appel est le premier appel de la séquence. La cible de recherche est la chaîne d'octets terminée par un nul pointée par str .
  • Si str est nul, l'appel est l'un des appels suivants de la séquence. La cible de recherche est déterminée par l'appel précédent dans la séquence.

Chaque appel dans la séquence recherche dans la cible de recherche le premier caractère qui n'est pas contenu dans la chaîne de séparation pointée par delim , la chaîne de séparation peut varier d'un appel à l'autre.

  • Si aucun tel caractère n'est trouvé, alors il n'y a aucun jeton dans la cible de recherche. La cible de recherche pour l'appel suivant dans la séquence reste inchangée. [1]
  • Si un tel caractère est trouvé, il constitue le début du jeton actuel. std::strtok recherche ensuite à partir de là le premier caractère contenu dans la chaîne de séparateurs.
    • Si aucun tel caractère n'est trouvé, le jeton actuel s'étend jusqu'à la fin de la cible de recherche. La cible de recherche pour l'appel suivant dans la séquence est une chaîne vide. [2]
    • Si un tel caractère est trouvé, il est remplacé par un caractère nul, ce qui termine le jeton actuel. La cible de recherche pour l'appel suivant dans la séquence commence au caractère suivant.

Si str ou delim n'est pas un pointeur vers une chaîne d'octets terminée par un caractère nul, le comportement est indéfini.

  1. Un jeton peut encore être formé lors d'un appel ultérieur avec une chaîne de séparation différente.
  2. Aucun autre jeton ne peut être formé lors des appels ultérieurs.

Table des matières

Paramètres

str - pointeur vers la chaîne d'octets terminée par un caractère nul à tokeniser
delim - pointeur vers la chaîne d'octets terminée par un caractère nul identifiant les délimiteurs

Valeur de retour

Retourne un pointeur vers le premier caractère du jeton suivant, ou un pointeur nul s'il n'y a pas de jeton.

Notes

Cette fonction est destructive : elle écrit les caractères ' \0 ' dans les éléments de la chaîne str . En particulier, un littéral de chaîne ne peut pas être utilisé comme premier argument de std::strtok .

Chaque appel à cette fonction modifie une variable statique : n'est pas thread-safe.

Contrairement à la plupart des autres tokenizers, les délimiteurs dans std::strtok peuvent être différents pour chaque token subséquent, et peuvent même dépendre du contenu des tokens précédents.

Implémentation possible

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;
}

Les implémentations réelles de cette fonction dans les bibliothèques C++ délèguent à la bibliothèque C, où elle peut être implémentée directement (comme dans MUSL libc ), ou via sa version réentrante (comme dans GNU libc ).

Exemple

#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";
}

Sortie :

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

Voir aussi

trouve la première occurrence de n'importe quel caractère d'un ensemble de séparateurs
(fonction)
retourne la longueur du segment initial maximal qui consiste
uniquement en des caractères non trouvés dans une autre chaîne d'octets
(fonction)
retourne la longueur du segment initial maximal qui consiste
uniquement en des caractères trouvés dans une autre chaîne d'octets
(fonction)
une view sur les sous-intervalles obtenus en divisant une autre view en utilisant un délimiteur
(modèle de classe) (objet adaptateur de plage)
Documentation C pour strtok