Partage
  • Partager sur Facebook
  • Partager sur Twitter

Besoin de précision sur cin

Sujet résolu
    17 janvier 2021 à 16:28:19

    Bonjour,

    Je débute, comme beaucoup en c++, donc pardon d'avance, mais j'ai besoin de précision à propos de l'utilisation de cin.

    J'ai pris pour habitude de chercher des exercices à droite à gauche pour m'exercer en fonction de mon niveau. En l’occurrence, je m'entraine à récupérer des entrées claviers et les stocker dans différentes variables.

    Je remarque que souvent, dans les solutions, je trouve :

    cin.ignore();
    cin.get();

    Jusqu'ici, j'ai cru comprendre, qu'on utilisait cin.ignore() après un cin quand on voulait utiliser un getline().

    Mais dans le cas de tous ces exercices très simples ( du type entrer la longueur, la largeur et pouf, je calcule le périmètre ), je ne vois pas du tout pourquoi ajouter ces lignes citées ci-dessus à la fin.

    Est-ce pour faire du "code propre" ?

    Merci par avance,

    Cordialement

    • Partager sur Facebook
    • Partager sur Twitter
      17 janvier 2021 à 16:41:29

      Salut,

      Les flux sont conçus de telles sortes qu'il faut effectivement purger leur tampon avant un getline. cf la FAQ https://cpp.developpez.com/faq/cpp/?page=Manipulation-de-la-console#Pourquoi-std-getline-ne-lit-il-rien-et-faut-il-l-executer-deux-fois-pour-que-la-ligne-soit-lue

      Maintenant je ne suis pas sur de bien comprendre ta question. Tu veux dire que tu vois ces deux instructions en fin de programme? Si c'est le cas, c'est tout sauf propre. Bien au contraire c'est quelque chose qu'il ne faut jamais mettre dans des vrais programmes, car une fois exécuter en console le programme fera toujours une pause, ce qui ne rime à rien. Ce n'est qu'un contournement dégueulasse pour palier à la mauvaise utilisation d'un IDE, ou à l'utilisation d'un IDE mal foutu: pour empêcher que la console d'exécution se referme toute seule. Je ne peux que conseiller de lire la doc de l'IDE ou d'en changer à la place.

      -
      Edité par lmghs 17 janvier 2021 à 16:42:10

      • Partager sur Facebook
      • Partager sur Twitter
      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
        17 janvier 2021 à 16:58:36

        Bonjour lmghs,

        Merci pour votre réponse.

        En effet, je trouve comme solution à des exercices ce genre de choses :

        #include<iostream>
        using namespace std;
        int main()
        {
        double largeur,longueur,surface, perimetre;
         
        cout << "Tapez la largeur du champ : "; cin >> largeur;
        cout << "Tapez la longueur du champ : "; cin >> longueur;
         
        surface = largeur * longueur;
        perimetre = 2 * (largeur + longueur);
         
        cout << "La surface vaut : " << surface << endl;
        cout << "Le perimetre vaut : " << perimetre << endl;
         
        cout << "Appuyez sur une touche pour continuer." << endl;
        cin.ignore();
        cin.get();
         
        return EXIT_SUCCESS;
        }

        Parfois même si cin n'a pas été utilisé :

        #include<iostream> using namespace std; int main(int argc, char **argv) { cout << "Hello world!" << endl; cout << "Voici un programme illustrant l'utilisation de cout!"; cout << "Appuyez sur une touche pour continuer ..." << endl; cin.ignore(); cin.get(); return EXIT_SUCCESS; }


        Merci pour cet éclairage.

        • Partager sur Facebook
        • Partager sur Twitter
          19 janvier 2021 à 14:31:39

          std::cin et l'équivalent C scanf sont faits pour lire des entrées correctement formattées (cas d'utilisation : pipelines entre processus UNIX). Ainsi, si tu souhaites obtenir un entier alors que l'utilisateur met une entrée à la ligne, une chaines de caractères non convertible il ne se passe rien et l'entrée utilisateur reste. C'est pour ça que std::cin/scanf ne doivent pas être utilisés pour lire l'entrée utilisateur.

          Il faut utiliser std::getline et analyser les lignes utilisateur à la place, en faisant les conversions qui vont bien : std::stod et autres amis.

          -
          Edité par markand 19 janvier 2021 à 14:32:17

          • Partager sur Facebook
          • Partager sur Twitter

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

            20 janvier 2021 à 8:58:55

            Merci pour ces précisions.
            • Partager sur Facebook
            • Partager sur Twitter
              20 janvier 2021 à 12:26:14

              std::cin >> d, c'est très bien pour extraire simplement des nombres et demander à l'utilisateur de recommencer si ce n'en n'est pas un. PAr contre, il faudrait toujours tester une extraction sur un flux. Meme un getline.

              Maintenant quand on va processer des fichiers avec des formats un peu plus complexes, effectivement on va employer d'autres approches où le fichier sera entièrement chargé en mémoire et on va employer des parser dédiés. Mais c'est un autre sujet pour moi.

              Sujet encore très différent de la mauvaise pratique qui consiste à rajouter une pause artificielle pour palier à la mauvaise utilisation de son outil de développement.

              -
              Edité par lmghs 20 janvier 2021 à 12:27:13

              • Partager sur Facebook
              • Partager sur Twitter
              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

              Besoin de précision sur cin

              × 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