Découper un texte avec Arduino
Nems
-
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
[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.
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
-
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 standardstrtok()
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-
-
-
-
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).
-