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
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    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!!

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    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
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    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.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    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!

  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 : 50
    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
    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
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    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

  7. #7
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    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 : 760
    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 chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    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
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    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)

  10. #10
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    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, 03h37
  2. du mal avec les fichiers ressources
    Par keil dans le forum MFC
    Réponses: 1
    Dernier message: 01/02/2006, 02h46
  3. Probleme avec strtok
    Par Premium dans le forum C
    Réponses: 3
    Dernier message: 23/11/2005, 13h28
  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, 03h41
  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, 20h08

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