C fournit deux fonctions strtok() et strtok_r() pour diviser une chaîne par un délimiteur. Diviser une chaîne est une tâche très courante. Par exemple, nous avons une liste d’éléments d’un fichier séparés par des virgules et nous voulons des éléments individuels dans un tableau.
Fonction strtok()
La méthode strtok() divise str[] selon les délimiteurs donnés et renvoie le jeton suivant. Il doit être appelé en boucle pour obtenir tous les jetons. Il renvoie NULL lorsqu'il n'y a plus de jetons.
Syntaxe de strtok()
char * strtok (char * str , const char * delims );>
Paramètres
- str : C'est le pointeur vers la chaîne à tokeniser. delims : C'est une chaîne contenant tous les délimiteurs.
Valeur de retour
- Il renvoie le pointeur vers le premier jeton rencontré dans la chaîne.
- Il renvoie NULL si aucun autre jeton n’est trouvé.
Exemples de strtok()
Exemple 1: Programme C pour montrer comment diviser une chaîne à l'aide de strtok().
C
// C program for splitting a string> // using strtok()> #include> #include> int> main()> {> >char> str[] =>'Geeks-for-Geeks'>;> >// Returns first token> >char>* token =>strtok>(str,>' - '>);> >// Keep printing tokens while one of the> >// delimiters present in str[].> >while> (token != NULL) {> >printf>(>' % s
'>, token);> >token =>strtok>(NULL,>' - '>);> >}> >return> 0;> }> |
>
>Sortir
Geeks for Geeks>
Exemple 2 : Programme pour démontrer l'utilisation de la fonction strtok() pour tokeniser une chaîne basée sur un délimiteur.
C
// C code to demonstrate working of> // strtok> #include> #include> // Driver function> int> main()> {> >// Declaration of string> >char> gfg[100] =>' Geeks - for - geeks - Contribute'>;> >// Declaration of delimiter> >const> char> s[4] =>'-'>;> >char>* tok;> >// Use of strtok> >// get first token> >tok =>strtok>(gfg, s);> >// Checks for delimiter> >while> (tok != 0) {> >printf>(>' %s
'>, tok);> >// Use of strtok> >// go through other tokens> >tok =>strtok>(0, s);> >}> >return> (0);> }> |
>
>Sortir
Geeks for geeks Contribute>
Application pratique de strtok()
strtok() peut être utilisé pour diviser une chaîne en plusieurs chaînes en fonction de certains séparateurs. UN fichier CSV simple le support peut être implémenté à l’aide de cette fonction. Les fichiers CSV ont des virgules comme délimiteurs.
Exemple 3 : Programme C pour démontrer l'utilisation de la fonction strtok() en C pour implémenter un un simple fichier CSV.
C
// C code to demonstrate practical application of> // strtok> #include> #include> // Driver function> int> main()> {> >// Declaration of string> >// Information to be converted into CSV file> >char> gfg[100] =>' 1997 Ford E350 ac 3000.00'>;> >// Declaration of delimiter> >const> char> s[4] =>' '>;> >char>* tok;> >// Use of strtok> >// get first token> >tok =>strtok>(gfg, s);> >// Checks for delimiter> >while> (tok != 0) {> >printf>(>'%s, '>, tok);> >// Use of strtok> >// go through other tokens> >tok =>strtok>(0, s);> >}> >return> (0);> }> |
>
>Sortir
1997, Ford, E350, ac, 3000.00,>
Fonction strtok_r()
Tout comme la fonction strtok() en C, strtok_r() effectue la même tâche d'analyse d'une chaîne en une séquence de jetons. strtok_r() est une version réentrante de strtok(), elle est donc thread-safe.
Syntaxe de strtok_r()
char * strtok_r (char * str , const char * delim , char ** saveptr );>
Paramètres
- str : C'est le pointeur vers la chaîne à tokeniser. delims : C'est une chaîne contenant tous les délimiteurs. saveptr : C'est un pointeur vers une variable char * qui est utilisée en interne par strtok_r() afin de maintenir le contexte entre les appels successifs qui analysent la même chaîne.
Valeur de retour
- Il renvoie le pointeur vers le premier jeton rencontré dans la chaîne.
- Il renvoie NULL si aucun autre jeton n’est trouvé.
Exemples de strtok_r()
Exemple 1: un programme C simple pour montrer l'utilisation de strtok_r().
C
// C program to demonstrate working of strtok_r()> // by splitting string based on space character.> #include> #include> int> main()> {> >char> str[] =>'Geeks for Geeks'>;> >char>* token;> >char>* rest = str;> >while> ((token = strtok_r(rest,>' '>, &rest)))> >printf>(>'%s
'>, token);> >return> (0);> }> |
>
>
Sortir
Geeks for Geeks>
Tokenisation imbriquée en C
Exemple 2 : Le programme C ci-dessous démontre l'utilisation de la fonction strtok_r() pour la tokenisation imbriquée.
C
#include> #include> int> main()> {> >char> str[] =>'Hello, World! Geeks for Geeks.'>;> >const> char> outer_delimiters[] =>'!.'>;> >const> char> inner_delimiters[] =>' ,'>;> >char>* token;> >char>* outer_saveptr = NULL;> >char>* inner_saveptr = NULL;> >token = strtok_r(str, outer_delimiters, &outer_saveptr);> >while> (token != NULL) {> >printf>(>'Outer Token: %s
'>, token);> >char>* inner_token = strtok_r(> >token, inner_delimiters, &inner_saveptr);> >while> (inner_token != NULL) {> >printf>(>'Inner Token: %s
'>, inner_token);> >inner_token = strtok_r(NULL, inner_delimiters,> >&inner_saveptr);> >}> >token = strtok_r(NULL, outer_delimiters,> >&outer_saveptr);> >}> >return> 0;> }> |
>
>
Sortir
Outer Token: Hello, World Inner Token: Hello Inner Token: World Outer Token: Geeks for Geeks Inner Token: Geeks Inner Token: for Inner Token: Geeks>
Différence entre strtok() et strtok_r()
Voyons les différences entre les fonctions strtok() et strtok_r() sous forme de tableau comme indiqué ci-dessous :
| Oui Non. | strtok() | strtok_r() |
|---|---|---|
| 1. | Il est utilisé pour diviser la chaîne str en une série de jetons. | Il est utilisé pour décoder une chaîne en un modèle pour les jetons. |
| 2. | La syntaxe est la suivante : char *strtok(char *str, const char *delim) commande par SQL aléatoire | Sa syntaxe est la suivante : char *strtok_r(char *string, const char *limiter, char **context); |
| 3. | Il utilise le délimiteur pour continuer. | Il s'agit d'une variante réintégrée de strtok(). |
| 4. | Cela prend deux paramètres. | Cela prend trois paramètres. |
| 5. | Il renvoie un pointeur vers le premier jeton trouvé dans la chaîne. | Il renvoie un pointeur vers le premier jeton trouvé dans la chaîne. |
| 6. | Ce n’est pas thread-safe. | Il est thread-safe. |