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

Langage C++ Discussion :

decouper une chaine de caractères


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    assistant ingénieur
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : assistant ingénieur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Par défaut decouper une chaine de caractères
    Salut, voici ma question
    j'ai une chaine de caractères char centre[255]; qui contient
    <Centre>-1.97873759985943254 -5.74970454086871108 9.11020907274524383</Centre>

    les trois nombres séparés par un espace sont les coordonnées x y et z d'un point.
    je voudrais récupérer ces coordonées dans des variables (float x, y, z
    Quelqu'un peut m'aider?

    ps: je travaille simplement avec un éditeur de texte et le compilateur gcc en ligne de commandes

    Merci

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Si tu travailles avec gcc, tu fais du C et tu t'es trompé de section...
    Il faut peut-être utiliser la fonction scanf

    Pour ce qui est du C++, l'idée est d'utiliser std::stringstream.
    Le code de base ressemblerai à ça (pas testé)
    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
    #include <sstream>
    // ...
    // On cherche à récupérer 3 doubles entourés d'une balise
    double x;
    double y;
    double z;
    char tmp = ' ';
    // On déclare un flux
    std::stringstream ss(ta_chaine_de_caractères);
    // On récupère les char jusqu'à '>' // Il y a peut être une technique pour modifier le délimiteur...
    while (tmp != '>' /* && je suis pas à la fin de mon flux*/) { ss >> tmp; }
    // On récupère les flottants
    ss >> x;
    ss >> y;
    ss >> z;
    //

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Par défaut
    La fonction sscanf permet un code beaucoup moins verbeux. A moins d'écrire un mini-parseur, la STL ne fournit rien d'équivalent à sscanf à ma connaissance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(int argc, char * argv[])
    {
        char centre[] = "<Centre>-1.97873759985943254 -5.74970454086871108 9.11020907274524383</Centre>";
        float x, y, z;
     
        sscanf(centre, "<Centre>%f %f %f</Centre>", &x, &y, &z);
     
        return 0;
    }

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 150
    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 150
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    tu peux t'en sortir également avec juste std::string et les méthodes find_first_of et substr
    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.

  5. #5
    Membre à l'essai
    Homme Profil pro
    assistant ingénieur
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : assistant ingénieur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Par défaut
    merci a tous
    backlash j'ai testé ta proposition, elle fonctionne quand je la lance telle qu'elle, par contre lorsque je l'intègre dans mon programme elle ne marche plus...
    voici le code:
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
      FILE *fic1, *fic2; 
     
      char ligne_lue[512];
    	char centre[255];
    	char XYZ[255];
    	float x, y, z;
     
      // ouverture du fichier passé en argument
      fic1 = fopen(argv[1], "r"); // ouvrir en lecture
     
      // recuperer les donnees du centre
    	int nb_lignes = 0;
     
      while(fgets(ligne_lue, 512, fic1) != NULL)
    	{
    		if (strstr(ligne_lue, "<Centre>"))
    		{
    			strcpy(centre, ligne_lue);
    		  nb_lignes++;
    		}
      }
    		  printf(centre);
    	// centre =                <Centre>-1.97873759985943254 -5.74970454086871108 9.11020907274524383</Centre>
     
    sscanf(centre, "<Centre>%f %f %f</Centre>", &x, &y, &z);
    printf("\nx: %f y: %f  z: %f\n", x, y, z);
      return 0;
    }

    et au lieu d'afficher x: -1.978738 y: -5.749704 z: 9.110209, il affiche
    x: 0.000000 y: -2663318699272307233791755474056511488.000000 z: 0.000000

    comprends pas...

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Sinon, il pourrait être intéressant d'utiliser une librairie pour la lecture du XML, histoire de ne pas réinventer la roue.

    http://pugixml.org/
    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
     
     
    if (argc<2) return 1;
     
    // Ouverture du document XML
    pugi::xml_document doc(argv[1]);
     
    // Lecture du noeud <Centre></Centre> (on suppose qu'il est à la racine)
    pugi::xml_node node = doc.child("Centre");
     
    // -1.97873759985943254 -5.74970454086871108 9.11020907274524383
    // est extrait sous la forme d'une chaine de caractères
    const char* chaine = node.child_value();
     
    // Un objet stringstream va permettre de débiter la chaine au travers d'un flux
    std::stringstream ss(chaine);
     
    float x, y, z;
    ss >> x >> y >> z;
     
    // Pour vérifier que x, y et z ont bien été remplis 
    assert (! ss.fail() );

Discussions similaires

  1. Réponses: 11
    Dernier message: 10/02/2009, 09h31
  2. decouper une chaine de caractère ?
    Par guybe dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/09/2008, 14h17
  3. decouper une chaine de caractère
    Par vileb29 dans le forum Langage
    Réponses: 6
    Dernier message: 30/08/2007, 13h50
  4. decouper une chaine de caractères
    Par MATH_03 dans le forum Access
    Réponses: 3
    Dernier message: 14/12/2006, 01h11
  5. [Tableaux] decouper une chaine de caractères
    Par pekka77 dans le forum Langage
    Réponses: 12
    Dernier message: 03/12/2005, 19h08

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