在C ++中循环不再工作

时间:2013-08-02 04:13:06

标签: c++ loops double

所以我一直在对这个程序进行故障排除,之前我已经问过这个问题。我认真对待了其他人的建议并将其应用到我的程序中,但它仍然无效。这是修改后的(虽然缩短了)代码:

#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 个答案:

答案 0 :(得分:4)

cin.clear()清除错误标志,并在缓冲区中保留输入余额后面的行的剩余内容。您需要可以致电cin.ignore()来正确处理此问题。

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

答案 1 :(得分:1)

您正在将流提取运算符与getline混合使用。在您的示例中,std::cin>>withdraw在用户输入"50"时获得字符串"50\n"。下一个getline只会获得"\n",这就是您提示两次("\n"!= "quit")的原因。

您可以通过以下几种方式解决此问题:使用getline获取所有内容并从每行获取所需内容,在getline之后调用cin>>以使下一个读取操作开始在下一行,或者,正如Oblivious船长建议的那样,使用cin.ignore