Analyser des données avec strtok en C


  • FrançaisFrançais


  • Certains programmes peuvent simplement traiter un fichier entier à la fois, et d’autres programmes doivent examiner le fichier ligne par ligne. Dans ce dernier cas, vous devrez probablement analyser les données de chaque ligne. Heureusement, le langage de programmation C a une fonction de bibliothèque C standard pour faire exactement cela.

    Le strtok La fonction décompose une ligne de données selon des “délimiteurs” qui divisent chaque champ. Il fournit un moyen simplifié d’analyser les données d’une chaîne d’entrée.

    Lecture du premier jeton

    Supposons que votre programme ait besoin de lire un fichier de données, où chaque ligne est séparée en différents champs par un point-virgule. Par exemple, une ligne du fichier de données pourrait ressembler à ceci :

    102*103;K1.2;K0.5

    Dans cet exemple, stockez cela dans une variable de chaîne. Vous avez peut-être lu cette chaîne en mémoire en utilisant un certain nombre de méthodes. Voici la ligne de code :

    char string[] = "102*103;K1.2;K0.5";

    Une fois que vous avez la ligne dans une chaîne, vous pouvez utiliser strtok pour retirer des “jetons”. Chaque jeton fait partie de la chaîne, jusqu’au délimiteur suivant. L’appel de base à strtok ressemble à ça:

    #include <string.h>
    char *strtok(char *string, const char *delim);

    Le premier appel à strtok lit la chaîne, ajoute un null (\0) au premier délimiteur, puis renvoie un pointeur vers le premier jeton. Si la chaîne est déjà vide, strtok renvoie NULL.

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

    int
    main()
    {
      char string[] = "102*103;K1.2;K0.5";
      char *token;

      token = strtok(string, ";");

      if (token == NULL) {
        puts("empty string!");
        return 1;
      }

      puts(token);

      return 0;
    }

    Cet exemple de programme extrait le premier jeton de la chaîne, l’imprime et se termine. Si vous compilez ce programme et l’exécutez, vous devriez voir cette sortie :

    102*103

    102*103 est la première partie de la chaîne d’entrée, jusqu’au premier point-virgule. C’est le premier jeton de la chaîne.

    Notez que l’appel strtok modifie la chaîne que vous examinez. Si vous souhaitez que la chaîne d’origine soit conservée, faites une copie avant d’utiliser strtok.

    Programmation et développement

    Lecture du reste de la chaîne sous forme de jetons

    Séparer le reste de la chaîne en jetons nécessite d’appeler strtok plusieurs fois jusqu’à ce que tous les jetons soient lus. Après avoir analysé le premier jeton avec strtoktout autre appel à strtok doit utiliser NULL à la place de la variable de chaîne. Le NULL permet strtok pour utiliser un pointeur interne vers la position suivante dans la chaîne.

    Modifiez l’exemple de programme pour lire le reste de la chaîne en tant que jetons. Utiliser une boucle while pour appeler strtok plusieurs fois jusqu’à ce que vous obteniez NULL.

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

    int
    main()
    {
      char string[] = "102*103;K1.2;K0.5";
      char *token;

      token = strtok(string, ";");

      if (token == NULL) {
        puts("empty string!");
        return 1;
      }

      while (token) {
        /* print the token */
        puts(token);

        /* parse the same string again */
        token = strtok(NULL, ";");
      }

      return 0;
    }

    En ajoutant la boucle while, vous pouvez analyser le reste de la chaîne, un jeton à la fois. Si vous compilez et exécutez cet exemple de programme, vous devriez voir chaque jeton imprimé sur une ligne distincte, comme ceci :

    
    

    Plusieurs délimiteurs dans la chaîne d’entrée

    En utilisant strtok fournit un moyen rapide et facile de diviser une corde en seulement les parties que vous recherchez. Vous pouvez utiliser strtok pour analyser toutes sortes de données, des fichiers de texte brut aux données complexes. Cependant, veillez à ce que plusieurs délimiteurs côte à côte soient identiques à un seul délimiteur.

    Par exemple, si vous lisiez des données CSV (valeurs séparées par des virgules, telles que les données d’une feuille de calcul), vous pourriez vous attendre à ce qu’une liste de quatre nombres ressemble à ceci :

    1,2,3,4

    Mais si la troisième “colonne” dans les données était vide, le CSV pourrait plutôt ressembler à ceci :

    1,2,,4

    C’est là qu’il faut faire attention strtok. Avec strtok, plusieurs délimiteurs côte à côte sont identiques à un seul délimiteur. Vous pouvez le voir en modifiant l’exemple de programme pour appeler strtok avec une virgule comme séparateur :

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

    int
    main()
    {
      char string[] = "1,2,,4";
      char *token;

      token = strtok(string, ",");

      if (token == NULL) {
        puts("empty string!");
        return 1;
      }

      while (token) {
        puts(token);
        token = strtok(NULL, ",");
      }

      return 0;
    }

    Si vous compilez et exécutez ce nouveau programme, vous verrez strtok interprète le ,, comme une seule virgule et analyse les données comme trois nombres :

    
    

    Connaissant cette limitation dans strtok peut vous faire économiser des heures de débogage.

    Utilisation de plusieurs délimiteurs dans strtok

    Vous pourriez vous demander pourquoi le strtok La fonction utilise une chaîne comme délimiteur au lieu d’un seul caractère. C’est parce que strtok peut rechercher différents délimiteurs dans la chaîne. Par exemple, une chaîne de texte peut avoir des espaces et des tabulations entre chaque mot. Dans ce cas, vous utiliseriez chacun de ces caractères “espaces” comme délimiteurs :

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

    int
    main()
    {
      char string[] = "  hello \t world";
      char *token;

      token = strtok(string, " \t");

      if (token == NULL) {
        puts("empty string");
        return 1;
      }

      while (token) {
        puts(token);
        token = strtok(NULL, " \t");
      }

      return 0;
    }

    Chaque appel à strtok utilise à la fois un espace et un caractère de tabulation comme chaîne de délimitation, permettant strtok pour analyser correctement la ligne en deux jetons.

    Conclure

    Le strtok La fonction est un moyen pratique de lire et d’interpréter les données des chaînes. Utilisez-le dans votre prochain projet pour simplifier la lecture des données dans votre programme.

    Source

    N'oubliez pas de voter pour cet article !
    1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
    Loading...

    La Rédaction

    L'équipe rédactionnnelle du site

    Pour contacter personnellement le taulier :

    Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée.