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 :

bloqué en mode saisie dans la console


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    touristepationné
    Inscrit en
    Janvier 2012
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : touristepationné
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 132
    Points : 57
    Points
    57
    Par défaut bloqué en mode saisie dans la console
    Bonjour,

    Mon problème est qu’après une saisie dans un if imbriqué dans un while, l’exécution semble se mettre en pause.

    Un peu comme lorsque le programme attend une valeur que l'utilisateur ne donne jamais.

    Voici mon code, je comprends vraiment pas d'où viens le bug (le code s'exécute correctement jusqu'à la fin de la ligne 27)

    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
     
    int ConfirmerMontant(double * montant)
    {
    string confirmer="r";// variable pour enregistrer la volonté de l'utilisateur//Egal a "r" pour rentrer dans le while de verif reponse utilisateur a la question souhaitez vous modifier votre montant de transaction?
    int verif=-1, modif=1; // modif permet de rester dans la boucle while si egal a 1
     
    // le montant saisi semble juste, une petite verif pour etre sûr
    // sorti de boucle quand l'utilisateur a abandonné ou confirmé son choix
    while (modif ==1)
    {
    // tant que l'utilisateur repond a coté
    while (confirmer!= "a" && confirmer != "A" && confirmer!= "o" && confirmer != "O" && confirmer != "y" && confirmer != "Y" && confirmer!= "n" && confirmer != "N" && confirmer!= "1" && confirmer != "0")
        {
    	cout << "\nREPERESouhaitez vous modifier votre montant de transaction?" << endl;
    	cout << "ou souhaitez vous abandonner la transaction?" << endl;
            cout << "o, y ou 1 pour oui, n ou 0 pour non, a pour abandonner\n";
            cin >> confirmer;
            // permet de recuperer le enter de validation precedent
            cin.get();
            cout << "\nVous avez choisi\t"<< confirmer<< endl;
            // je reduis les cas de saisie a seulement 3 pour pouvoir rester ou sortir de la bouble do while
            if (confirmer == "o" || confirmer == "O" || confirmer == "y" || confirmer == "Y" || confirmer == "1" )  {
    	  confirmer="y";
    	  modif=1;
    	  cout << "Indiquez le nouveau montant de la transaction"<< endl;
              scanf("%lf",&montant);
              cin.get();
    	}
            else if (confirmer == "n" || confirmer == "N" || confirmer == "0" ) {confirmer="n" ; modif=0;  verif=1;}
            else if (confirmer == "a" || confirmer == "A" ) {confirmer="a" ; modif=0;verif=-1;}
        }
    }
        return verif;
    }
    Impossible de comprendre, quelqu'un peut m'aider?

    Y a t-il un champion dans la salle?

  2. #2
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    La récupération de l'entrée utilisateur semble hasardeuse, je ne vois pas l'utilité de cin.get();.

    Mieux vaut passer par un std::getline( std::cin, string_input );.
    Ainsi on reçoit l'intégralité du buffer sous forme de chaine de caractères.

    Par la suite on peut :
    • tester si un caractère est un chiffre avec "isdigit"
    • convertir une chaine de numéros en nombre avec "stringstream"

    Aussi, il serait peut-être intéressant de diviser cette fonctions en plusieurs petites. On gagnerait en lisibilité et les fonctions seraient facilement "testables".

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    PilloBuenaGente a tout à fait raison. Je rajouterai juste 3 petits conseils:

    - ne passe pas ton paramètre par pointeur, mais par référence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int ConfirmerCommande( double & montant )
    {
    /* code */
    montant = 10.3;
    /*code*/
    }
    - n'utilise pas scanf, mais encore std::cin.

    - jette un coup d’œil à cette FAQ, tu trouveras beaucoup de réponses à tes questions.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Membre du Club
    Homme Profil pro
    touristepationné
    Inscrit en
    Janvier 2012
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : touristepationné
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 132
    Points : 57
    Points
    57
    Par défaut
    Merci pour vos réponses, le probleme venait d'une initialisation manquante juste apres le 1er while.

    en effet le code est vraiment a retravailler, je vais le refaire en tenant compte de vos remarques.

    Merci!

Discussions similaires

  1. Masquer une saisie dans une Console ?
    Par BISMARCK 007 dans le forum Débuter
    Réponses: 3
    Dernier message: 01/12/2013, 10h37
  2. [JUnit] [JUnit 4] Simuler des saisies dans la console - Plusieurs fois
    Par GrooveRage dans le forum Tests et Performance
    Réponses: 4
    Dernier message: 15/02/2009, 22h56
  3. Réponses: 2
    Dernier message: 10/11/2008, 09h05
  4. Fedora 6 bloqué en mode console
    Par nicoesenlamierda dans le forum RedHat / CentOS / Fedora
    Réponses: 7
    Dernier message: 01/10/2008, 16h33
  5. problème de saisie dans un menu en mode console
    Par kromartien dans le forum Débuter
    Réponses: 2
    Dernier message: 27/01/2008, 16h52

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