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 :

Bug avec les strings


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 86
    Points : 53
    Points
    53
    Par défaut Bug avec les strings
    Bonjour,

    J'ai un problème sous VC++ 6 lorsque j'exécute le code ci-dessous avec les fichiers ci joints dans le meme repertoire que l'execute j'obtiens par exemple le resultat suivant :

    traduisez le mot suivant : courir : to run(la seule réponse rentre au clavier)
    Et ben non, la bonne réponse est : to run
    traduisez le mot suivant : to do: Et ben non, la bonne reponse est : faire
    traduisez le mot suivant : to do:

    D'avance merci pour votre aide.

    Sphere.
    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
     #include <iostream>   // ça, tout le monde connaît !
    #include <string>     // pour les chaînes de caractères
    #include <fstream>    // pour lire dans les fichiers .txt
    #include <vector>     // pour pouvoir utiliser les vecteurs
    #include <ctime>      // pour les nombres aléatoires
     
    using namespace std;
     
    int aleatoire(const int min, const int max)
    {
        return (int)(min+((float) rand()/RAND_MAX*(max - min + 1)));
    }
     
    void traduction(vector<string>& tabCherche, vector<string>& tabRes, int alea)
    {
        string traduc;
        cout << "Traduisez le mot suivant : " << tabCherche[alea] << " : ";
        cin >> traduc;
     
        if(traduc == tabRes[alea])  //je vérifie la traduction
            cout << "Tres bien" << endl << endl;
        else if(traduc == "0000") // condition d'arrêt
        {
            cout << endl;
            cout << "Fin du test" << endl << endl;
            exit(0);
        }
        else
            cout << "Eh ben non, la bonne reponse est : " << tabRes[alea] << endl << endl;
    }
     
    int main()
    {
        const int min = 0;
        const int max = 1;
     
        srand((unsigned) time(NULL));  // sert à initialiser le rand()
     
        vector<string> tabfr;  // les vecteurs se déclarent comme ceci !
        vector<string> taban;
        string mot;  // chaîne intermédiaire servant à stocker le mot dans le vecteur
     
        ifstream fichierAnglais("anglais.txt", ios::in); // ouverture lecture seule
        ifstream fichierFrancais("francais.txt", ios::in);
     
        if(fichierAnglais && fichierFrancais)
        {
            while(getline(fichierAnglais, mot)) // tant qu'on peut lire dans le fichier
            {
                taban.push_back(mot);  // pour rajouter dans un vecteur
                getline(fichierFrancais, mot);         
                tabfr.push_back(mot);
            }
            fichierAnglais.close();   // fermeture des fichiers
            fichierFrancais.close();
        }
        else
        {
            cerr << "Impossible d'ouvrir un des 2 fichiers !" << endl;
            exit(1);
        }
     
        for(int j = 0; j < 100; j++)
        {
            int alea2 = aleatoire(min, max);
            int alea = aleatoire(min, tabfr.size()-1);  // le -1 car dans un vecteur, on compte à partir de 0
     
            if(alea2 == 0) // si c'est 0, il demande un mot français
                traduction(taban, tabfr, alea);
            else // sinon, il demande un mot anglais
                traduction(tabfr, taban, alea);
        }
     
        return 0;
    }
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Le problème vient de la façon de récupérer la réponse :en effet l'opérateur >> s'arrête au premier espace, il extrait les mots un par un.

    Pour récupérer l'expression entière, utilise getline() comme pour la lecture des fichiers.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Et aussi: Dans ces circonstances, quand tu dois déboguer ce genre d'erreurs, commence par afficher ce que tu as saisi. Tu aurais ainsi vu le problème plus vite.
    Code C++ : 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
    void traduction(vector<string>& tabCherche, vector<string>& tabRes, int alea)
    {
        string traduc;
        cout << "Traduisez le mot suivant : " << tabCherche[alea] << " : ";
        cin >> traduc;
        cout << "Vous avez saisi : \"" << traduc << "\"" << endl; // <---- ICI
     
        if(traduc == tabRes[alea])  //je vérifie la traduction
            cout << "Tres bien" << endl << endl;
        else if(traduc == "0000") // condition d'arrêt
        {
            cout << endl;
            cout << "Fin du test" << endl << endl;
            exit(0);
        }
        else
            cout << "Eh ben non, la bonne reponse est : " << tabRes[alea] << endl << endl;
    }
    PS: Tes références sur les vecteurs devraient être const, au passage.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 86
    Points : 53
    Points
    53
    Par défaut
    Merci a tous pour immense aide.

    Je pense que je me suis un peu emmêlé les pinceaux dans ma façon de debugage depuis que j'ai lu le chapitre sur le sujet dans "Trucs et Astuces pour les nuls en C++"....


    getline fonctionne mais il m'a fallu définir la variable traduc, comme char [256] au lieu de string mais en plus avec 4 warnings:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        char traduc[256];
        cout << "Traduisez le mot suivant : " << tabCherche[alea] << " : ";
        cin.getline (traduc,256);
    N'était il pas possible de garder la déclaration de traduc en string?
    J'ai également défini mes vectors en const (sans vraiment comprendre la raison) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void traduction(const vector<string>& tabCherche, const vector<string>& tabRes, int alea)
    Encore merci pour tout.

    Sphere

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    getline(cin, traduc);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 86
    Points : 53
    Points
    53
    Par défaut
    Ca bug comme au tout debut....

    Sphere

Discussions similaires

  1. [HTML][Bug] Avec les float/clear, c'est moi ou FF ?
    Par Séb. dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 02/01/2006, 14h56
  2. [Sécurité] bug avec les variables de session!
    Par ozzmax dans le forum Langage
    Réponses: 7
    Dernier message: 09/12/2005, 19h41
  3. probleme avec les string sur ITA2 64 bits!
    Par vince3320 dans le forum SL & STL
    Réponses: 5
    Dernier message: 22/08/2005, 19h59
  4. Lecture de fichier : Probleme avec les string
    Par soda_o_rat dans le forum SL & STL
    Réponses: 10
    Dernier message: 11/08/2005, 22h59
  5. [CR9] Bug avec les champs à valeur vide ?
    Par Djob dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 15/07/2003, 21h21

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