循环重复次数超过应有次数的问题

Issue with loop repeating one more time than it should

本文关键字:问题 循环      更新时间:2023-10-16
#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 + 1 Enter

terminate = cin.peek();

这一行将窥探缓冲区,读取那里的内容,但不会将其从缓冲区中删除

cin >> a >> operators >> b;

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

现在你剩下的是Enter密钥,它仍然在缓冲区中,下次你尝试读取缓冲区时会读取它,这就是你发出的地方,因为下次你调用terminate = cin.peek();时,你得到的是n,而不是你期望的的q

我注意到您可能试图通过调用std::cin::clear来解决这个问题,但该函数并不是这样做的。该函数会重置iostate flags,而这不是您想要的。如果您想清除缓冲区,则必须调用std::cin::ignore