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 :

fonction: parser une phrase selon un certain caractère à une certaine position


Sujet :

C++

  1. #1
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut fonction: parser une phrase selon un certain caractère à une certaine position
    Bonjour,

    J'aimerais créer une fonction pour parser du texte selon un caractère et sa position, on pourrait définir sa syntaxe par: getTok(string,position,char); . J'aimerais par exemple retourner le deuxième mot d'une phrase en faisant: getTok("ma phrase comme ceci",2,32); où 32 est la valeur ascii de mon caractère donc un espace, ce qui devrait me retourner "phrase". Seulement je ne sais pas comment je pourrais procéder. Si vous aviez des idées argumentées d'exemple, je vous remercie d'avance.

  2. #2
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Salut,

    Je ne crois pas que ce genre de function existe dans la STL donc il va falloir l'implementer toi meme. Par contre en utilisant la class std::string et toutes les fonctionnalites qu'elle possede cela devrait etre facile, la methode find te permettra de trouver la position de ton caractere de separation et la methode substr te permettra de creer tes tokens.
    XXiemeciel

  3. #3
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Salut,

    Cette question de la FAQ devrait pouvoir t'aider :
    http://c.developpez.com/faq/cpp/?pag...#STRING_tokens

  4. #4
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Merci, je vais regarder ça de près et essayer quelque chose. Je vous tiens au courrant =]

  5. #5
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Donc je me suis penché sur vos deux propositions. Celle avec subtr et find n'était pas du tout mauvaise voir très bonne seulement, find ne me retourne que la première occurence et ensuite avec substr j'ai la suite de la chaine à partir de cette occurence. Donc cela ne me convient pas, puisque je veux parser la chaine avec un caractère spécifié et retourner le morceau de chaine que je veux par la position donnée (exemple: getTok("je ne sais point.",3," "); devra me retourner: "sais'.) . C'est pour ça que la seconde avec getline, est ce qu'il me faut. Seulement, je n'ai pas l'en-tête stream.h .. Est-ce normal ? Dois-je me le procurer ? Quel est la solution à ce problème?

    f:\microsoft visual studio\myprojects\socketzuh\main.cpp(4) : fatal error C1083: Cannot open include file: 'stream': No such file or directory
    ma ligne 4 est la suivante
    #include <stream>
    j'ai essayé de le remplacer par stream.h, mais il n'y a rien à faire..

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Et avec
    ?

    Sinon, avec subtr et find, tu aurais pu t'en sortir, il faut 'juste' les appliquer récursivement (par exemple, si tu veux le troisème mot, l'appliquer 3 fois de suite).

  7. #7
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Bon voila, j'ai fini ma fonction et elle fonctionne parfaitement. Voici un petit code de 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #include <iostream>
    #include <sstream>
    #include <string>
    #include <cstdlib>
     
    using namespace std;
     
    const char *getTok(const char str[],const int pos,const char asc) {
    	istringstream iss(str);
    	string mot;
    	for(int i=1;i<=pos;i++) { getline(iss,mot,asc); }
    	size_t size = mot.size() + 1;
            char * buffer = new char[size];
    	strncpy_s(buffer,size,mot.c_str(),size);
    	return buffer;
    }
     
    int main() {
    	char hu[] = "200.;0;.0.;90-200;.0.0.2;23";
    	cout<<hu<<endl<<endl
    		<<"getTok(hu,5,';')"<<" -> "<<getTok(hu,5,';')<<endl;
            system("PAUSE");
    	return 0;
    }
    Merci beaucoup pour votre aide et vos renseignements =]

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pourquoi renvoyer un char* alloué dynamiquement (qu'il faudra donc libérer -- ce que tu ne fais pas), plutôt que le string que tu obtiens à la fin de tes traitements ?

    Par ailleurs tu devrais gérer les éventuelles erreurs.

  9. #9
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Parce que je vais m'en servir pour mon "bot irc". Afin de parser les informations renvoyées par le serveur et pouvoir manipuler tout ça comme je veux. Notamment avec des strcmp, ou strstr (mais plus ciblé que dans une phrase entière). Et pour celà j'ai besoin d'un pointeur sur un char ou un char.

    [edit]
    Pour ce qui est de libèrer le char *, je viens de le faire
    [/edit]

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    std::string sait faire tout ce que font tes fonctions C (et même un peu plus).

  11. #11
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Bon je crois être perdu

    les fonctions comme strstr, strcmp, et tout ce qui s'en suit ne font pas partit de "std::string" ? Si non, qu'est-ce que std::string ? Enfin là je suis un peu perdu, ce serait sympa de me redirriger dans le droit chemin s'il vous plaît

  12. #12
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Citation Envoyé par alceste
    Enfin là je suis un peu perdu, ce serait sympa de me redirriger dans le droit chemin s'il vous plaît
    => http://c.developpez.com/faq/cpp/?page=strings
    Fiquet
    - FAQ SDL
    - FAQ C++

  13. #13
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Ah, ben voila j'y vois plus clair. En fait quand tu parlais de "std::string" tu parlais de <string> =]

    Merci pour l'info, je vais alors chercher les fonctions de <string> équivalente ou plus "performante" à celles de <cstring>.

  14. #14
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Tout compte, fait je vais oublier toutes mes fonctions de C. Et rester du côté de C++, ça m'arrange ^^

    Merci pour votre aide et vos conseils !

Discussions similaires

  1. [WD-2007] Réordonner des mots dans une phrase selon leur type
    Par pbeecham dans le forum VBA Word
    Réponses: 3
    Dernier message: 15/03/2011, 10h50
  2. Afficher Cacher une phrase selon résultat du PHP
    Par FracMaster dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 16/05/2007, 13h20
  3. Réponses: 4
    Dernier message: 23/04/2007, 14h01
  4. Réponses: 5
    Dernier message: 28/08/2006, 18h11
  5. Réponses: 3
    Dernier message: 13/06/2006, 16h36

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