Découper un texte avec Arduino

Nems -  
[Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour j'ai un problème face à moi , jai une variable qui contient un texte (je programme avec Arduino) le texte ressemble a ça: 12345,12345,12345,12345 (c'est un exemple)
Je veux pouvoir afficher chaque bout de texte séparer par une virgule. Mon programme ne doit pas être gourmand en mémoire car j'ai un long programme.

1 réponse

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut Nems,

    En C standard, on peut faire cela avec strtok(), cette fonction semblant disponible dans le langage C/C++ sur lequel se base Arduino (je ne peux pas tester cependant).

    #include <stdio.h>
    #include <string.h>
    
    int main(void) {
        char texte[255] = "12345,12345,12345,12345";
        char * p;
    
        p = strtok(texte, ",");
        while (p != NULL) {
            printf("%s\n",p);
            p = strtok(NULL, ",");
        }
    
        return 0;
    }

    donne :

    12345
    12345
    12345
    12345

    La fonction standard
    strtok()
    opère en écrasant les caractères séparateurs et en les remplaçant avec des
    '\0'
    terminant chaque sous-chaîne identifiée. Le contenu originel en mémoire est donc altéré, mais cela te permet d'identifier et de traiter les sous-chaînes sans avoir besoin de mémoire supplémentaire, en utilisant juste une variable pointeur pour accéder aux sous-chaînes successives.

    Dal
    0
    1. Nems
       
      Le truc c'est que je veux stocker chaque morceau de texte dans une variable 1 pour chaque
      0
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      dans ce cas, déclare un tableau de pointeurs sur char et stocke les pointeurs vers les sous-chaînes dedans :-)
      0
    3. Nems
       
      Heu un exemple -) sur le bout de programme
      0
    4. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      juste pour te montrer le principe, sur ton exemple, et sans contrôle d'erreurs, cela donne :

      #include <stdio.h>
      #include <string.h>
      
      int main(void) {
          char texte[255] = "12345,2345,345,45";
          char * morceau[4];
          char * p;
          int n = -1;
      
          p = strtok(texte, ",");
          while (p != NULL) {
              morceau[++n] = p;
              p = strtok(NULL, ",");
          }
      
          for (n=0; n<4; n++)
              printf("morceau[%d] = %s\n", n, morceau[n]);
      
          return 0;
      }

      le résultat étant :

      morceau[0] = 12345
      morceau[1] = 2345
      morceau[2] = 345
      morceau[3] = 45

      Dans un code réel, il faudrait vérifier qu'il n'y a pas plus de 4 sous-chaînes, s'il y en a moins décider aussi quoi faire, et si le texte comprend un nombre indéterminé de sous-chaînes, faire une allocation dynamique, avec malloc et des realloc pour étendre la mémoire au fur et à mesure si nécessaire, ou faire une première passe en comptant le nombre de
      ','
      pour faire direct un malloc de la bonne dimension (cette dernière solution étant en 2 temps, elle nécessite a priori plus de temps de calcul, mais elle optimisera l'utilisation de la mémoire).
      0