Namespaces
Variants

strtok, strtok_s

From cppreference.net
< c ‎ | string ‎ | byte
Défini dans l'en-tête <string.h>
(1)
char * strtok ( char * str, const char * delim ) ;
(jusqu'à C99)
char * strtok ( char * restrict str, const char * restrict delim ) ;
(depuis C99)
char * strtok_s ( char * restrict str, rsize_t * restrict strmax,
const char * restrict delim, char ** restrict ptr ) ;
(2) (depuis C11)

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

1) Une séquence d'appels à strtok décompose la chaîne pointée par str en une séquence de jetons, 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 est non nul, l'appel est le premier appel dans 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 dans 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éparateurs pointée par delim , la chaîne de séparateurs peut être différente d'un appel à l'autre.
  • Si aucun tel caractère n'est trouvé, alors il n'y a pas de jetons dans la cible de recherche. La cible de recherche pour le prochain appel dans la séquence reste inchangée. [1]
  • Si un tel caractère est trouvé, il constitue le début du jeton actuel. strtok recherche ensuite à partir de là le premier caractère qui est 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 le prochain appel 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 le prochain appel 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.
2) Identique à (1) , à l'exception des différences suivantes :
  • À chaque appel, écrit le nombre de caractères restant à examiner dans str dans * strmax et écrit l'état interne du tokeniseur dans * ptr .
  • Les appels suivants dans la séquence doivent transmettre strmax et ptr avec les valeurs stockées par l'appel précédent.
  • Les erreurs suivantes sont détectées à l'exécution et appellent la fonction gestionnaire de contraintes actuellement installée, sans rien stocker dans l'objet pointé par ptr :
    • strmax , delim , ou ptr est un pointeur nul.
    • * ptr est un pointeur nul pour un appel ultérieur dans la séquence.
    • * strmax est supérieur à RSIZE_MAX .
    • La fin du jeton trouvé ne se produit pas dans les premières * s1max caractères de la cible de recherche.
Si les deux str pointent vers un tableau de caractères qui ne contient pas le caractère nul et strmax pointent vers une valeur qui est supérieure à la taille de ce tableau de caractères, le comportement est indéfini.
Comme pour toutes les fonctions à vérification de limites, strtok_s n'est garantie d'être disponible que si __STDC_LIB_EXT1__ est défini par l'implémentation et si l'utilisateur définit __STDC_WANT_LIB_EXT1__ à la constante entière 1 avant d'inclure <string.h> .
  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
strmax - pointeur vers un objet qui contient initialement la taille de str : strtok_s stocke le nombre de caractères restant à examiner
ptr - pointeur vers un objet de type char * , qui est utilisé par strtok_s pour stocker son état interne

Valeur de retour

1) Retourne un pointeur vers le premier caractère du jeton suivant, ou un pointeur nul s'il n'y a pas de jeton.
2) Retourne un pointeur vers le premier caractère du jeton suivant, ou un pointeur nul s'il n'y a pas de jeton ou s'il y a une violation de contrainte d'exécution.

Note

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 strtok .

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

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

La fonction strtok_s diffère de la fonction POSIX strtok_r en se protégeant contre le stockage en dehors de la chaîne en cours de tokenisation, et en vérifiant les contraintes d'exécution. La signature CRT Microsoft strtok_s correspond à cette définition POSIX strtok_r , et non à celle du C11 strtok_s .

Exemple

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

Sortie possible :

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'

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.24.5.8 La fonction strtok (p: TBD)
  • K.3.7.3.1 La fonction strtok_s (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.24.5.8 La fonction strtok (p: TBD)
  • K.3.7.3.1 La fonction strtok_s (p: TBD)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 7.24.5.8 La fonction strtok (p: 369-370)
  • K.3.7.3.1 La fonction strtok_s (p: 620-621)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.21.5.8 La fonction strtok (p: 332-333)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 4.11.5.8 La fonction strtok

Voir aussi

trouve la première occurrence de n'importe quel caractère d'une chaîne dans une autre chaîne
(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)
(C95) (C11)
trouve le jeton suivant dans une chaîne large
(fonction)