HOWTO · C

Utiliser la fonction strtok en C

Cet article présente l'utilisation de la fonction strtok en C

Sur cette page

Cet article présente plusieurs méthodes d’utilisation de la fonction strtok en C.

Utiliser la fonction strtok pour marquer une chaîne de caractères avec un délimiteur donné

La fonction strtok fait partie de la bibliothèque standard C définie dans le fichier d’en-tête <string.h>. Elle décompose la chaîne de caractères donnée en jetons séparés par le délimiteur spécifié. La fonction strtok prend deux arguments - un pointeur vers la chaîne à découper comme premier paramètre et la chaîne du délimiteur comme second. Notez que, la chaîne de délimitation est traitée comme un ensemble de caractères, indiquant le délimiteur séparé. La fonction renvoie le pointeur à une chaîne de caractères à terminaison nulle, qui représente le jeton suivant. Attention cependant, lorsque la même chaîne est analysée avec plusieurs appels strtok, le premier argument du pointeur doit être NULL après l’appel initial de la fonction.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  char *str1, *token;
  int j;

  if (argc != 3) {
    fprintf(stderr, "Usage: %s string delim\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  for (j = 1, str1 = argv[1];; j++, str1 = NULL) {
    token = strtok(str1, argv[2]);
    if (token == NULL) break;
    printf("%d: %s\n", j, token);
  }

  exit(EXIT_SUCCESS);
}

Exemple de commande :

./program "Temporary string to be parsed" " "

Production :

1: Temporary
2: string
3: to
4: be
5: parsed

Utilisez la fonction strtok_r pour marquer une chaîne avec deux délimiteurs

Une autre version de la fonction est disponible, appelée strtok_r, qui est une variante réentrante mieux adaptée aux programmes multi-threads. Ces deux fonctions modifient la chaîne passée en premier argument, et elles ne peuvent pas être sur des chaînes constantes. L’exemple de code suivant transforme la chaîne donnée en une hiérarchie à deux niveaux. Le premier est constitué de jetons répartis sur les délimiteurs passés en second argument au programme. La boucle interne divise chaque jeton à partir de la tokenisation initiale, et finalement, le programme sort les résultats sur la console.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  char *str1, *str2, *token, *subtoken;
  char *saveptr1, *saveptr2;
  int j;

  if (argc != 4) {
    fprintf(stderr, "Usage: %s string delim subdelim\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  for (j = 1, str1 = argv[1];; j++, str1 = NULL) {
    token = strtok_r(str1, argv[2], &saveptr1);
    if (token == NULL) break;
    printf("%d: %s\n", j, token);

    for (str2 = token;; str2 = NULL) {
      subtoken = strtok_r(str2, argv[3], &saveptr2);
      if (subtoken == NULL) break;
      printf(" --> %s\n", subtoken);
    }
  }

  exit(EXIT_SUCCESS);
}

Exemple de commande :

./program "Temporary string to be parsed" " " "aeio"

Production:

1: Temporary
 --> T
 --> mp
 --> r
 --> ry
2: string
 --> str
 --> ng
3: to
 --> t
4: be
 --> b
5: parsed
 --> p
 --> rs
 --> d