Découper un texte avec Arduino

Fermé
Nems - 28 sept. 2018 à 06:31
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 28 sept. 2018 à 14:10
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

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 28 sept. 2018 à 10:28
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
Le truc c'est que je veux stocker chaque morceau de texte dans une variable 1 pour chaque
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 28 sept. 2018 à 13:22
dans ce cas, déclare un tableau de pointeurs sur char et stocke les pointeurs vers les sous-chaînes dedans :-)
0
Heu un exemple -) sur le bout de programme
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 28 sept. 2018 à 14:17
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