循环重复一次的问题比应该重复

时间:2014-04-10 20:28:36

标签: c++

#include <iostream>
#include <cmath>
#include <string>

using namespace std;

int main()
{
    char terminate;
    double a, b, answer;
    char operators;

    cout << "Please enter your expression: ";
    terminate = cin.peek();
    cin >> a >> operators >> b;

    while (terminate != 'q')
    {
        switch(operators)
        {
            case '+':
                answer = a + b;
                break;
            case '-':
                answer = a - b;
                break;
            case '*':
                answer = a * b;
                break;
            case '/':
                answer = a / b;
                break;
            case '^':
                answer = pow(a,b);
                break;
        }

        cout << a << " " << operators << " " << b << " = " << answer << endl;

        cout << "Please enter your expression: ";
        cin.clear();
        terminate = cin.peek();
        cin >> a >> operators >> b;
    }

    return 0;
}

这是我的简单计算器程序,它意味着重复并要求用户输入二进制表达式,直到输入值“q”,但是在输入“q”时,即使变量,while循环仍然执行一次terminate的值为“q”。我不明白为什么这样做,任何帮助将不胜感激。感谢

1 个答案:

答案 0 :(得分:1)

让我们看看这个输入发生了什么的例子:

1 + 1 Enter

terminate = cin.peek();

这一行将查看缓冲区,读取其中的内容,但不会将其从缓冲区中删除

cin >> a >> operators >> b;

此行将显示1 + 1并将其存储在a operators b中,并从缓冲区中删除这些字符

现在你剩下的是Enter键,它仍然在缓冲区中,下次你尝试读取缓冲区时会被读取,这是你下次调用的时候发出的{ {1}}您获得了terminate = cin.peek();而不是您期望的\n

我注意到您可能尝试通过调用q来解决该问题,但这不是该功能的作用。该函数会重置std::cin::clear,这不是您要查找的内容。如果要清除缓冲区,则必须调用std::cin::ignore