2013-08-02 3 views
2

Так что я искал эту программу, и я уже задавал вопросы об этом раньше. Я серьезно относился к советам других людей и применил их к своей программе, но он все еще не работает. Это модифицированный (хотя укороченный) код:Loop in C++ не работает снова

#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; 
} 

Там не будет проблемой, и код работает, но вывод таков: https://www.dropbox.com/s/aocn6asjr4ofcws/Broken%20Output.PNG

Как вы можете видеть «Вывод , депозит или выход: «строка печатает себя дважды всякий раз, когда цикл перезапускается. Кто-нибудь знает, почему? Любая помощь приветствуется. Я - новый программист, поскольку C++ идет, поэтому любая помощь приветствуется.

+2

Поиск * getline skipping * здесь, и вы получите много ответов. – chris

+1

Просто используйте 'std :: cin.ignore();' после чтения ввода с помощью >>, чтобы пропустить символ '\ n'. – mhcuervo

ответ

4

cin.clear() очищает флаг ошибки и оставляет оставшееся содержимое строки, которая соответствует входному балансу в буфере. Вам нужно позвонить cin.ignore(), чтобы справиться с этим правильно.

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

Ничего себе, я не могу поверить, что ответ был таким простым. Спасибо за ответ, заменив std :: cin.clear() на std :: cin.ignore(), устранив проблему без икоты. Благодарю. – SiliconArmour

1

Вы смешиваете операторы извлечения потока с помощью getline. В вашем примере std::cin>>withdraw получил строку "50", когда пользователь ввел "50\n". Следующий getline просто получает "\n", поэтому вы получаете подсказку дважды ("\n"! = "quit").

Вы можете решить эту проблему несколькими способами: либо использовать getline за все, и получить то, что вам нужно из каждой строки, вызовите getline после cin>> сделать следующую операцию чтения начинаются в следующей строке, или, как предложил капитан Oblivious , используйте cin.ignore.