#include <string.h> // <cstring> en C++
char * strtok( char * string, const char * delimiters ); // Avant C99 char * strtok( char * restrict string, const char * restrict delimiters ); // A partir de C99
Cette fonction permet d'extraire, un à un, tous les éléments syntaxiques (les tokens) d'une chaîne de caractères. Pour contrôler ce qui doit être extrait, vous devez spécifier l'ensemble des caractères pouvant faire office de séparateurs de tokens.
Pour extraire tous les tokens, vous devez invoquer autant de fois que nécessaire la fonction strtok
. Lors du premier appel
vous devez passer la chaîne à découper ainsi que la liste des séparateurs. En retour, vous récupérerez le premier token. Ensuite, vous ne devrez plus
repasser la chaîne à découper. A la place, il faudra fournir un pointeur nul (NULL
) et vous récupérerez le token suivant.
La chaîne de caractères à découper, ne doit pas être constante car elle est modifiée à chaque appel à la fonction strtok
.
Comme nous venons de le dire, à la fin de l'extraction, vous ne pouvez plus exploiter le contenu du premier paramètre car la chaîne d'origine a été altérée.
La fonction strtok
n'est pas « thread-safe ». Cela veut dire qu'elle ne doit pas être utilisée en parallèle par plusieurs
threads, car elle utilise un unique pointeur vers la chaîne à découper pour les rappels suivants (une variable locale statique).
Si un token est encore disponible, la fonction strtok
renvoie ce nouveau token.
Dans le cas contraire, la fonction renvoi un pointeur nul (NULL
).
L'exemple de code suivant extrait tous les mots présents dans un chaîne de caractères initiale.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { // La chaine de caractères à traiter. char str[] = "- Voici une phrase avec quelques séparateurs ! -"; // La définitions de séparateurs connus. const char * separators = " ,.-!"; // On cherche à récupérer, un à un, tous les mots (token) de la phrase // et on commence par le premier. char * strToken = strtok ( str, separators ); while ( strToken != NULL ) { printf ( "%s\n", strToken ); // On demande le token suivant. strToken = strtok ( NULL, separators ); } return EXIT_SUCCESS; } |
strToken
est pointeur vers le token en cours d'extraction. En fait, on pointe bien à l'intérieur de la chaîne de caractères
initiale. Il ne faut donc surtout pas chercher à libérer la mémoire ciblée par strToken
via un appel à la fonction
free
.
char str[] = "- Voici une phrase avec quelques séparateurs ! -";
crée une copie de la chaîne de caractères initiale et constante,
dans la pile d'exécution (la stack, en anglais). Il ne faut surtout pas remplacer cette instruction par
char * str = "- Voici une phrase avec quelques séparateurs ! -";
: la zone de mémoire pointée serait constante et la fonction strtok
planterait systématiquement (« segmentation fault » sous Linux/Unix).
Et voici le résultat produit par cet exemple :
$> gcc -o sample sample.c $> ./sample Voici une phrase avec quelques séparateurs $>
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :