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

SL & STL C++ Discussion :

Récupérer parties d'une string. Regexp? Strtrok?


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Par défaut Récupérer parties d'une string. Regexp? Strtrok?
    Bonjour à tous,

    j'ai une affection toute particulière pour le C/C++, langage avec lequel je perds la moitié de mes cheveux à chaque fois que je veux faire un truc.
    (Je préfère le Java, même si c'est pas bien.)

    Bref.

    J'ai une string avec des infos, dont deux que je veux récupérer:

    string line = "VR=2.0,ID=01:68:39:39:11:00:00:bd,SP=B-2,DB=20,DR=601,TM=1151,TS=2016";

    Tous les nombres changent à chaque fois, donc...

    Les parties que je veux récupérer sont en rouge.

    Je ne sais pas comment faire ça.
    En java, j'aurais fait un coup d'expression régulière (car en plus je pouvais voir si la chaîne correspondait au pattern), mais en C++, j'ai trop de mal.

    Comment faire?

    J'aimerais utiliser les expressions régulières, mais je n'ai pas envie d'importer de library externes. (genre boost).
    J'ai essayé de faire un sscanf avec des bouts d'expression régulières, mais ça ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char beaconID[5];
    int beaconDist = 0;
        sscanf(line.c_str(),"VR=*[^,],ID=*[^,],SP=%5[^,]s,DB=*[^,],DR=%d,[.+]",beaconID,&beaconDist);
    Je me suis sans doute gouré...

    Quelqu'un pourrait me venir en aide s'il vous plait???

    Merci d'avance !

    Philippe

  2. #2
    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
    Si tu ne veux pas boost (mais comment pourrait-on vraiment ne pas vouloir boost), les expressions régulières de boost ont été intégrés dans le langage, à l'intérieur du TR1. Peut-être si tu as un compilateur récent les prend-il en compte ?
    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.

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Par défaut
    Je n'en veux pas trop parce que c'est une partie d'un gros projet, et mon code doit s'intégrer rapidement et ne pas avoir de librairies qui s'étendent partout.

    Pour le compilateur, le problème c'est qu'au final, le projet va devoir être compilé sur le PC d'un prof, qui, selon ses dires, a un compilateur ancien.

    J'ai fait un autre truc, qui ne me plaît pas trop (même pas du tout), mais bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        int posSP = line.find("SP=");
        int posDR = line.find("DR=");
     
        if(posSP > -1 && posDR > -1)
        {
            string beaconID = line.substr(posSP+3, (line.find(",",posSP)-posSP)-3);
            string beaconDist = line.substr(posDR+3, (line.find(",",posDR)-posDR)-3);
            cout << beaconID << " - " << beaconDist << endl;
        }
        else
            cout << "Line ignored" << endl;

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par z980x Voir le message
    J'ai fait un autre truc, qui ne me plaît pas trop (même pas du tout)
    Pourquoi donc ? C'est certainement le genre de solution que j'aurais choisi. Avec quelques petites corrections
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        string::size_type posSP = line.find("SP=");
        string::size_type posDR = line.find("DR=");
     
        if(posSP != string::npos && posDR != string::npos)
        ...
    plus une gestion d'erreur au cas ou aucune "," ne soit trouvé après les champs.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Par défaut
    En fait c'est le "+/-3" qui me gêne.

    Enfin je vais faire comme ça quand même.

    Merci pour ta correction, et ton conseil. J'ai ajouté une gestion d'erreur pour la place de la virgule.

    Merci

    Philippe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] [preg_match] comment extraire qu'une partie d'une string
    Par pierrot10 dans le forum Langage
    Réponses: 2
    Dernier message: 14/01/2012, 00h11
  2. Réponses: 4
    Dernier message: 11/03/2009, 04h35
  3. Réponses: 10
    Dernier message: 26/04/2008, 13h14
  4. [C#] Comment extraire les parties d'une string ?
    Par mrpowerboy dans le forum C#
    Réponses: 3
    Dernier message: 21/02/2006, 09h10
  5. Réponses: 2
    Dernier message: 15/03/2005, 15h40

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