langage c les limites de la fonction strtok.
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

langage c les limites de la fonction strtok.



  1. #1
    Philippe8

    langage c les limites de la fonction strtok.


    ------

    Bonjour,

    Je reçois une chaîne de type char "12042022,,,45.256,,456" sur le port série de mon Arduino.
    J'essaye d'extraire les champs entre les virgules. Le problème est que de nouveaux champs apparaissent entre les virgules avec le temps qui s'écoule. La chaîne n'est complètement formée qu'au bout de 5 minutes. J'utilise la fonction strlok pour extraire ces champs.

    Avec strlok, les champs vides ne sont pas pris en compte or J'ai besoin d'un champs vide " " entre les virgules pour pouvoir traiter correctement ma chaîne (sinon j'ai des erreurs). J'ai lu qu'on pouvait utiliser la fonction strchr à la place de strlok pour résoudre ce problème mais je ne trouve aucun exemple.

    Si quelqu'un pouvait m'orienter dans ce sens ?

    Merci.

    -----

  2. #2
    Jack
    Modérateur

    Re : langage c les limites de la fonction strtok.

    Bonjour,
    quelques précisions sont nécessaires:
    - le nombre de champs est-il fixe?
    - tu veux un code qui ne fait que détecter un nouveau champ afin de le traiter ou tu veux récupérer tous les champs dans un tableau de chaines par exemple?

  3. #3
    polo974

    Re : langage c les limites de la fonction strtok.

    juste pour exemple:

    Code:
    #include <stdio.h>
    #include <string.h>
    
    
    int main(int argc, char ** argv)
    {
        char* cur;
        char* next;
        int nbv;
        if (argc != 2) return 1;
    
        // je scanne le premier (et je compte les champs pour le fun)
        for (cur = argv[1], nbv=0;;)
        {
            next = strchr(cur, ','); // recherche de la prochaine virgule
            if (next == NULL) break; // yapu, on sort de la boucle
            *next = 0; // on remplace la virgule par un 0 terminal
            printf("% 2d: <%s>\n", nbv, cur); // on imprime, (exploite, copie, etc....)
            cur = next + 1; // la suite du texte...
            nbv += 1;    //compte les virgules pour le fun, peut servir d'index et on boucle
        }
        // et le dernier bout, il faut bien s'en occuper...
        printf("et le dernier:\n");
        printf("% 2d: <%s>\n", nbv, cur); // on imprime, (etc...)
        return 0;
    }
    gcc strchr.c -o strchr
    ./strchr "12042022,,,45.256,,456"
    0: <12042022>
    1: <>
    2: <>
    3: <45.256>
    4: <>
    et le dernier:
    5: <456>

    bon, je massacre la chaîne initiale, mais sinon, on peut faire des copies et ajouter le '\0' au bout...


    ah, ben voilà, quand je documente mon bout de code, je me fais doubler par Jack pour les questions "annexes"...
    Dernière modification par polo974 ; 14/04/2022 à 13h18.
    Jusqu'ici tout va bien...

  4. #4
    Philippe8

    Re : langage c les limites de la fonction strtok.

    Bonjour et merci pour vos réponses.
    Je travaille sur arduino et je n'ai pas de fonction main().
    le nombre de champs est fixe, sauf qu'ils n'apparaissent dans leur totalité qu'au bout d'un certain nombre de minutes. Par exemple si je prends la chaîne : "12042022,,,45.256,,456,200,65 ", je ne vais prendre que trois sous-chaînes : "45.256", "200", "65", la sous chaîne "200" peut apparaître au bout de 10 minutes. Celles-ci seront stockées dans un tableau de char *variables par exemple variables[0] = "45.256", variables[1] = "200", variables[3] = "65",variables[4] = '\0' . Je détermine le champs à extraire en fonction du nombre de virgules parcourues, pour le sous champs "200", ce sera la 6ème virgule. Etant donné que tous les champs n'apparaissent pas en même temps, si "200" est absent, je dois avoir un champs vide : " ". Avec strtok, c'est problématique car si "200" est absent, je crois que je saute les virgules, il n'est pas possible de les compter. Du coup tout est décalé...
    je sais pas si je suis clair. Chaque sous-chaîne est transmise à une fonction pour être traitée, le décalage créé par l'absence de la sous-chaîne entraîne des décalages et des dysfonctionnement en mémoire.
    Merci

  5. A voir en vidéo sur Futura
  6. #5
    Philippe8

    Re : langage c les limites de la fonction strtok.

    Le nombre de virgule est connu, il y en a 12... Chaque sous-chaîne est positionnée après une virgule qui est toujours la même. La chaîne initiale est stockée dans un tableau de char dont le nombre d'éléments est fixe, ils sont séparés par des virgules. Par exemple "12042022,,,45.256,,456,20 0,65 " est stockée dans
    Code:
    leTexte(35);
    .

  7. #6
    vgondr98

    Re : langage c les limites de la fonction strtok.

    https://stackoverflow.com/questions/...d-empty-fields
    Apparemment sur linux, il y a la fonction strsep()

  8. #7
    polo974

    Re : langage c les limites de la fonction strtok.

    est-ce que tu dois garder les bouts de chaînes? si oui, ajouter un strcpy.
    est-ce que tu peux traiter chaque bout dans la boucle de découpage? sinon, ajouter un strcpy.

    tu oublies que j'ai utilisé la fonction main (c'est pour que je puisse compiler dans mon coin), tu remplaces argv[1] par ton buffer de réception.

    il faut ajouter dans la boucle un switch (nbv) { case 0: traite0(cur); break; .....}
    (et un dernier traiter11(cur) à la fin pour le dernier bout.)

    (traite0 à traite11 étant les fonctions pour chaque item) (tu peux éviter le switch avec un tableau de pointeur de fonctions pour la frime...)
    Jusqu'ici tout va bien...

  9. #8
    Jack
    Modérateur

    Re : langage c les limites de la fonction strtok.

    Je pense qu'un sscanf devrait faire l'affaire. Voici un exemple utilisant également la virgule comme délimiteur.

  10. #9
    polo974

    Re : langage c les limites de la fonction strtok.

    Citation Envoyé par vgondr98 Voir le message
    https://stackoverflow.com/questions/...d-empty-fields
    Apparemment sur linux, il y a la fonction strsep()
    Et même sur arduino (la cible) ! ! !
    Jusqu'ici tout va bien...

  11. #10
    polo974

    Re : langage c les limites de la fonction strtok.

    Citation Envoyé par Jack Voir le message
    Je pense qu'un sscanf devrait faire l'affaire. Voici un exemple utilisant également la virgule comme délimiteur.

    J'y ai cru un instant, mais non... ça coince entre 2 virgules...

    Par contre le regex dans la directive, j'avais pas encore vu ça ! ! !
    Jusqu'ici tout va bien...

  12. #11
    Jack
    Modérateur

    Re : langage c les limites de la fonction strtok.

    C'était trop beau pour que ça marche

  13. #12
    Philippe8

    Re : langage c les limites de la fonction strtok.

    Merci à tous,
    J'ai maintenant de quoi me débrouiller. Si j'y arrive pas je reviens vers vous.

    Bonne soirée.

Discussions similaires

  1. Alternative Strtok() C
    Par Nestati dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 13/01/2021, 09h19
  2. Utilisation de la fonction strtok (Arduino et voie série)
    Par Shantorian dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 17/12/2017, 15h18
  3. Langage des Limites et Tangente à une courbe
    Par skopios dans le forum Mathématiques du collège et du lycée
    Réponses: 3
    Dernier message: 20/03/2012, 17h37
  4. langage et continuité limites Tes
    Par invite51748edc dans le forum Mathématiques du collège et du lycée
    Réponses: 3
    Dernier message: 01/10/2008, 16h53
  5. fonction strtok et pointeur en µC (PIC)
    Par invite3bf0caa8 dans le forum Électronique
    Réponses: 6
    Dernier message: 23/05/2008, 17h12