Partage
  • Partager sur Facebook
  • Partager sur Twitter

Getline n'attends pas

    16 juin 2021 à 4:16:02

    Bonjour,

    dans mon code j'utilise getline pour capturer une phrase mais quand le programme arrive à la ligne de getline j'ai l'impression qu'il ne s'arrête pas et execute tout de suite ce qui vient après.

    Voici le code :

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    struct aliment
    {
        string nom;
        float valeur;
    };
    
    
    struct nutriment
    {
        string nom;
        vector<aliment> aliments;
    };
    
    string bfr;
    
    int main()
    {
        vector<nutriment> nutriments;
    
        aliment aliment1 = {"pomme", 2};
    
        nutriment nutriment1 = {"pomme", };
    
        nutriments.push_back(nutriment1);
    
        nutriments[0].aliments.push_back(aliment1);
    
        cout << nutriments[0].nom << " " << nutriments[0].aliments[0].valeur;
    
        while(bfr != "quit")
            {
                cout << "aj = ajouter" << endl << "mod = modifier" << endl << "sup = supprimer" << endl << "quit = quitter" << endl << "af = afficher" << endl << "ref = refresh" << endl << endl << " > ";
                cin >> bfr;
    
                if(bfr == "quit")
                {
                    bfr = "quit";
                }
    
                else if(bfr == "aj")
                {
                    cout << "nom du nutriment > ";
                    cin.clear();
                    getline(cin, bfr);
                    cout << bfr;
    
                }
    
                system("cls");
            }
    
    
        return 0;
    }
    

    Donc j'ai tenté de vider le string pour voir si ça peut changer quelque chose mais toujours le même résultat donc quand je tape "aj" on m'affiche "aj" et rien si je vide...

    Pourriez vous m'aider s'il vous plait ?

    -
    Edité par enum 16 juin 2021 à 4:18:13

    • Partager sur Facebook
    • Partager sur Twitter
      16 juin 2021 à 8:57:49

      Avant tout chose, n'utilise pas system("cls") c'est non portable et inutile (tu connais beaucoup d'application en ligne de commande qui le font ?)

      Quand tu utilises >> vers un std::string ça lit jusqu'au prochain blanc (et le retour à la ligne en fait parti) et donc il reste ça à lire. Cela signifie aussi que tu peux pas lire une chaîne avec des espaces. De manière général, l'utilisation direct de std::cin ou scanf et autre est plutôt fait pour lire une entrée proprement formatée, pas celle de l'utilisateur.

      Pour faire simple, vu que tu souhaite lire une ligne jusqu'à la touche entrée, utilise getline à chaque demande puis analyse le résultat de celle ci. Donc remplace simplement ta ligne 38 par un getline.

      • Partager sur Facebook
      • Partager sur Twitter

      git is great because Linus did it, mercurial is better because he didn't.

        16 juin 2021 à 9:54:57

        Ligne 48 remplace le cin.clear(); par :

        cin.ignore(255, '\n');



        • Partager sur Facebook
        • Partager sur Twitter
          17 juin 2021 à 5:26:08

          Merci beaucoup ça marche !
          • Partager sur Facebook
          • Partager sur Twitter

          Getline n'attends pas

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown