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 :

[String] Comportement bizarre


Sujet :

SL & STL C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Points : 139
    Points
    139
    Par défaut [String] Comportement bizarre
    J'ai écrit un début de programme Dictionnaire, pr le moment c'est un truc tout bête. 0 : j'ajoute un mot, 1 : j'affiche le contenu du dico 2 : je recherche un mot 3 : je sauvegarde le dico 4 : je quitte le dico.

    le code est le suivant :
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    #include <iostream>
    #include <string>
    #include <vector>
    #include <fstream>
     
    using namespace std;
     
    int main()
    {
        string s;
        vector<string> dico;
        int i;
        int choix;
        int sortie=4;
        string menu="- Taper 0 pour ajouter un mot au dictionnaire.\n- Taper 1 pour consulter le dictionnaire.\n- Taper 2 pour faire une recherche.\n- Taper 3 pour sauvegarder le dictionnaire.\n- Taper 4 pour sortir."; 
        cout << menu << endl;
        cin >> choix;
        cout << "choix : " << choix << endl;  
        i=0;
        while(choix!=sortie)
        {    
            switch (choix)
            {
    	        case 0: //saisie
    	        {    
    	             cout << "Saisie du mot n°"<< i << " :" << endl;
    	             cin >> s;
    	             cout << "Le mot n°" << i << " saisi est " << s << endl << endl;
    	             dico.push_back(s);
    	             cout << "Le mot " << dico[i] << " a été saisi dans le dictionnaire" << endl << endl;
    	             i++;
    	             break;
    	        }
    	        case 1: //consultation
    	        {
    			 	 if(!dico.empty())
    			 	 {
    		             cout << endl << "Le dico contient les mots suivants :" << endl;
    		             for(int cpt=0;cpt<dico.size();cpt++)
    		             {
    		                     cout << dico[cpt] << endl;
    		             }
    		             cout << endl;
    				 }
    				 else cout << "Le dictionnaire est vide" << endl;
    				 break;
    	        }
    	        case 2 : 
    	        {
    	             string motrech="";
    	             cout << "Taper le mot à rechercher dans le dictionnaire" << endl;
    	             cin >> motrech;
    	             bool trouve=false;
    	             vector<string>:: iterator it;
    	             it=dico.begin();
     
    	             while(!trouve && it!=dico.end())
    	             //for(it; it!=dico.end(); it++)
    	             {
    	             	if((*it)==motrech)
    	              	{
    	               		cout << "Le mot " << motrech << "a été trouvé dans le dico."<< endl;    
    	               		trouve=true;
    	               	}
    	            	else it++;
    	             }
    	             if(!trouve)
    	             {
    	                    cout << "Le mot " << motrech << "n'existe pas dans le dico." << endl;
    	             } 
    				 break;  
    	        }
    	        case 3 : //pas fait encore
     
    	        default: cout << "Saisie invalide. Veuillez recommencer."; break;
    	    }  
         	cout << menu << endl; 
            cin >> choix;
    		cout << endl;
        }
        system("pause");
            return 0;
     
    }
    Jusque là, ça marche presque parfaitement. Presque, parce que si j'ajoute des "mots unitaires", ça passe sans problème (ex : le mot dico est ajouté, affiché et trouvé sans pb). Par contre, si je rentre une expression (ex : "mon dico"), avec un espace donc, là, mon while devient infini, et j'ai un affichage infini de mon "menu".
    Que se passe-t-il? Je manipule des string, donc ça ne devrait rien changer que je mette un espace ou non dans une string...
    merci à qui pourra m'aider.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Cette entrée de la FAQ
    devrait te renseigner.

    MAT.

  3. #3
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    C'est normal, parce que cin n'enregistre que mot par mot l'entrée dans une string. Pour récupérer toute une ligne, il faudrait utiliser std::getline().

    La boucle infinie vient du fait que comme tu as tapé 2 mots, le ou les mots qui restent sont restés dans le tampon d'entrée de la console, et donc 'cin' a essayé d'extraire un entier à partir des mots qui restaient, ce qu'il n'a pas réussi, et donc choix n'a pas été modifié.

    Comme 'cin' n'a pas réussi à faire ce qu'on lui demandait, il s'est mis dans un état invalide où il ne réagit plus aux tentatives d'extraction de données d'entrées. Donc 'choix' vaut toujours '0', on retourne à la case départ, la tentative d'extraire un nouveau mot n'est pas exécutée, donc le même mot précédent est rajouté, et voilà la boucle infinie.

  4. #4
    Membre habitué Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 162
    Points
    162
    Par défaut
    au lieu de mettre :
    Il faut mettre :
    - Microsoft Dynamics AX Technical Expert
    - OpenERP Module Developper
    - Mécanicien informaticien passioné
    - CV : http://www.viadeo.com/fr/profile/mohamed-amine.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Points : 139
    Points
    139
    Par défaut
    ça marche.
    j'ai remplacé tous mes cin pouvant récupérer une chaine avec espace par un getline(cin,s), et en faisant précéder ces getline par une purge clavier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );
    Merci

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

Discussions similaires

  1. Comportement bizarre de mes FPS
    Par Ekinoks dans le forum OpenGL
    Réponses: 7
    Dernier message: 22/08/2005, 15h14
  2. xsl:test .... avec comportement bizarre
    Par Blue LC dans le forum XMLRAD
    Réponses: 2
    Dernier message: 10/06/2005, 13h56
  3. [ACESS][MEMO][ISNULL]Comportement bizarre
    Par seb.49 dans le forum ASP
    Réponses: 2
    Dernier message: 09/06/2004, 10h44
  4. [HttpClient] comportement bizarre, saute des catch()...
    Par iubito dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 04/02/2004, 15h25
  5. [Sybase] Comportement bizarre d'une table
    Par sdozias dans le forum Sybase
    Réponses: 4
    Dernier message: 03/02/2004, 10h39

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