2013-08-02 3 views
2

J'ai donc dépanné ce programme et j'ai déjà posé des questions à ce sujet auparavant. J'ai pris au sérieux les conseils d'autres personnes et je les ai appliquées à mon programme, mais ça ne marche toujours pas. Ceci est modifié (quoique raccourci) Code:La boucle en C++ ne fonctionne plus

#include <iostream> 
#include <string> 

double balance, withdraw, deposit; 
std::string choice; 

void withdrawmon() 
{ 
    balance -= withdraw; 
} 
void depositmon() 
{ 
    balance += deposit; 
} 

int main() 
{ 
    std::cout << "Welcome to the Bank Program." << std::endl; 
    std::cout << "Enter a starting balance: "; 
    std::cin >> balance; 
    std::cin.clear(); 
    do 
    { 
     std::cout << "Withdraw, deposit, or quit: "; 
     std::getline (std::cin, choice); 
     if(choice == "withdraw") 
     { 
      std::cout << "Enter amount to withdraw: "; 
      std::cin >> withdraw; 
      withdrawmon(); 
      std::cout << "Your current balance is $" << balance << std::endl; 
     } 
     else if(choice == "deposit") 
     { 
      std::cout << "Enter amount to deposit: "; 
      std::cin >> deposit; 
      depositmon(); 
      std::cout << "Your current balance is $" << balance << std::endl; 
     } 
    } 
    while(choice != "quit"); 
    std::cout << "Thanks for using the Bank Program. Your final balance was $" << balance << std::endl; 
    return 0; 
} 

Il n'y aurait pas un problème, et le code fonctionne, mais la sortie est comme ceci: https://www.dropbox.com/s/aocn6asjr4ofcws/Broken%20Output.PNG

Comme vous pouvez le voir le « RETIRER , déposer ou quitter: "la ligne s'imprime deux fois à chaque redémarrage de la boucle. Quelqu'un sait pourquoi? Toute aide est appréciée. Je suis un nouveau programmeur en ce qui concerne le C++, donc toute aide est appréciée.

+2

Rechercher * getline skipping * ici et vous obtiendrez beaucoup de réponses. – chris

+1

Utilisez juste 'std :: cin.ignore();' après avoir lu l'entrée avec >> pour ignorer le caractère '\ n'. – mhcuervo

Répondre

4

cin.clear() efface le drapeau d'erreur et laisse le contenu restant de la ligne qui suit le solde d'entrée dans le tampon. Vous devez appeler cin.ignore() pour gérer correctement.

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
+0

Wow, je ne peux pas croire que la réponse était aussi simple. Merci pour la réponse, le remplacement de std :: cin.clear() par std :: cin.ignore() a résolu le problème sans hiccups. Merci. – SiliconArmour

1

Vous mélangez des opérateurs d'extraction de flux avec getline. Dans votre exemple, std::cin>>withdraw a obtenu la chaîne "50" lorsque l'utilisateur a entré "50\n". Le prochain getline obtient juste le "\n", qui est pourquoi vous obtenez l'invite deux fois ("\n"! = "quit").

Vous pouvez résoudre ce de plusieurs façons: soit utiliser getline pour tout et obtenir ce dont vous avez besoin sur chaque ligne, appelez getline après votre cin>> pour faire la prochaine opération de lecture commence à la ligne suivante, ou, comme le capitaine Inconscient suggéré , utilisez cin.ignore.