strtok, strtok_s
|
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.
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.
- 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.
strtokrecherche 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.
- À 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.
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>
.
- ↑ Un jeton peut encore être formé lors d'un appel ultérieur avec une chaîne de séparation différente.
- ↑ 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
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) |
|
Documentation C++
pour
strtok
|
|