IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

J'ai du mal avec strtok


Sujet :

C++

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 093
    Points : 943
    Points
    943
    Par défaut J'ai du mal avec strtok
    Bonjour,
    j'essaye avec peine un truc qui doit etre bien simple.

    J'ai cette chaine caractere:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    +CCLK: 14/12/09,22:23:45+0
    et j'aimerais supprimer
    +CCLK:
    Donc on m'a suggérer d'utiliser strtok() je ne connais pas
    J'ai essayé ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Serial.println(response[1]);
      char * pch;
      pch = strtok (response[1]," ");
     
      Serial.println(pch[1]);
    je pensais que dans pch[0], j'ai "+CCLK" et que dans pch[1], j'ai ce qui suit après l'espace. Mais pch[1] m'affiche 'c'

    Comment puis-je spliter la chaine comme délimiteur, l'espace?

    Merci!!
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Salut,

    as-tu lu la doc ?
    Return Value
    If a token is found, a pointer to the beginning of the token.
    Otherwise, a null pointer.
    A null pointer is always returned when the end of the string (i.e., a null character) is reached in the string being scanned.
    Y'a même un exemple bien parlant fourni.

    pch c'estun char*, donc pch[1] est un char..

    Bon par contre... c'est du C.

    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 093
    Points : 943
    Points
    943
    Par défaut
    Ha, excuse moi,
    oui j'ai lu ceci, mais je n'ai pas compris...
    http://www.cplusplus.com/reference/cstring/strtok/

    J'ai aussi essayé de faire
    mais c am'a affiché
    +CCLK:
    alors que je souhiate
    14/12/09,22:23:45+0
    Bon par contre... c'est du C
    Désolé, je ne distingue pas encore les deux.
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  4. #4
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 093
    Points : 943
    Points
    943
    Par défaut
    Mais alors en continuant sur ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (pch != NULL)
      {
        printf ("%s\n",pch);
        pch = strtok (NULL, " ,.-");
      }
    Comment je fais pour afficher la deuxieme partie.

    Par exemple si j'ai ceci (ou j'ai rajouter un espace avant l'heure)
    +CCLK: 14/12/09 22:23:45+0
    1) dans le cas ou je veux la date "14/12/09"
    2) dans le cas ou je veux l'heure "2:23:45+0"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ma_funtion(1)
    {
    char str[] ="CCLK: 14/12/09 22:23:45+0";
      char * pch;
      pch = strtok (str," ");
      while (pch != NULL)
      {
        printf ("%s\n",pch);
        pch = strtok (NULL, " ,.-");
      }
    }
    Comment modifier while,
    pour que lorsque je passe 1 dans ma_function(1); il m'affiche
    CCLK
    pour que lorsque je passe 2 dans ma_function(2); il m'affiche
    14/12/09
    pour que lorsque je passe 3 dans ma_function(3); il m'affiche
    22:23:45+0
    ?
    Merci!
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Tu fais du C ou du C++ ? Parce que ce sont deux langages différents, et en C++, il y a plusieurs alternatives à strtok, qui est une fonction avec pleins de défauts...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 093
    Points : 943
    Points
    943
    Par défaut
    Ben je ne sais pas
    Ce code est utiliser sur un microcontroller Arduino qui "accepte" les deux..
    Je ne sais pas quoi répondre, à dire vrai. On va dire du C++.
    Ce qui m'importe c'est d'arriver à ce que je souhaite , soit de sélectionner la partie que j'ai besoin
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  7. #7
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Du côté de boost il y a boost::tokenizer ou boost::token_iterator. Après, boost sur Arduino... Je ne sais pas, mais techniquement ça ne doit pas être un problème.

    Du côté de la stl il y std::find ou std::getline.

    (Perso, devoir connaître la fin de la chaîne me gêne, ainsi que l'obligation d'un std::string pour getline (vivement les ranges).)

    Quelque exemples avec std::find:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #include <cstring> // strlen
    #include <iostream>
    #include <algorithm>
     
    int main()
    {
      char s[] = "+CCLK: 14/12/09 22:23:45+0";
     
      typedef const char * iterator;
     
      {
        iterator end = s + strlen(s);
        iterator first = s /*+ 7 si on est sûr que "+CCLK: " est toujours au début*/;
        while (*first) {
          iterator last = std::find(first, end, ' ');
          // [first, first+n] avec n = last - first
          (std::cout << '"').write(first, last - first) << "\"\n";
          first = *last ? last + 1 : last;  // ou std::find_if(last, end, [](char c) { return c != ' '; });
        }
      }
     
      endl(std::cout);
     
      // en suposant que le format est toujours valide:
      {
        iterator end = s + strlen(s);
        iterator first1 = s + 7;
        iterator last1 = std::find(first1, end, ' ');
        (std::cout << '"').write(first1, last1 - first1) << "\"\n";
        std::cout << '"' << (last1+1) << "\"\n";
      }
     
      endl(std::cout);
     
      // en modifiant la chaîne d'origine pour donner une impression de split
      {
        char * s1 = s + 7;
        char * end = s1 + strlen(s1);
        char * last1 = std::find(s1, end, ' ');
        char * s2 = last1+1;
        *last1 = '\0';
        std::cout << '"' << s1 << "\"\n";
        std::cout << '"' << s2 << "\"\n";
      }
    }

  8. #8
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Alors je suis un peu fatigué et donc j'ai peut être rien compris à la discussion, donc pardonnez moi si je dis une grosse bêtise.
    pierrot10: tu as une chaîne de caractères qui contient ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    +CCLK: 14/12/09,22:23:45+0
    et tu veux la transformer en ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    14/12/09,22:23:45+0
    C'est bien ça ???
    Pourquoi t'embêter à utiliser une fonction qui va essayer d'interpréter la chaîne de caractères, si ton objectif c'est tout simplement de supprimer les 7 premiers caractères, systématiquement ?
    Si ta chaîne est stockée dans un bête tableau de caractères, tu peux tout simplement déplacer le pointeur de 7 caractères vers la droite, en utilisant +=7 ou encore l'opérateur [7].
    Vu qu'on est sur le forum C++, il est aussi possible que ta chaîne soit stockée dans un std::string, auquel cas la méthode substr pourrait aussi faire l'affaire.

  9. #9
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 093
    Points : 943
    Points
    943
    Par défaut
    Hello,

    non et oui.

    J'ai bien ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    +CCLK: 14/12/09,22:23:45+0
    et j'aimerais avoir
    ca
    +CCLK:
    et ca
    14/12/09,22:23:45+0
    comme si en PHP j'utilisait la fonction explode
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    explode(" ","+CCLK: 14/12/09,22:23:45+0");

    C'est la base de ma question.

    Ensuite et au final, j'aimerais bien avoir ca:
    2014-12-09 22:23:45
    afin de l'avoir dans un format prêt pour l'enregistrer dans ma bas MySQL

    Mais si je peux arriver à trouver l'équivalende de explode(), c'est déjà super!!!

    Merci

    (petite précision, si je ne l'ai pas dit. Je travaille avec un Arduino Mini pro et un SIM908)
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. LIMIT calcul mal avec des JOIN
    Par FMaz dans le forum Requêtes
    Réponses: 21
    Dernier message: 12/07/2006, 04h37
  2. du mal avec les fichiers ressources
    Par keil dans le forum MFC
    Réponses: 1
    Dernier message: 01/02/2006, 03h46
  3. Probleme avec strtok
    Par Premium dans le forum C
    Réponses: 3
    Dernier message: 23/11/2005, 14h28
  4. [POO] Un peu de mal avec les membres de ma classe
    Par Spack dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/11/2005, 04h41
  5. problème avec strtok pour récupérer les vides
    Par manikou dans le forum MFC
    Réponses: 4
    Dernier message: 02/06/2005, 21h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo