如果在循环内给 cin 一个意外输入,C++ 换行符会自动作为输入输入

C++ Line break entered as input automatically if you give a cin an unexpected input inside loop

我认为输入流的缓冲区有问题。每当我为 number1 或 number 2 变量输入一个非常大的数字(10 个或更多字符)或一个字母时,控制台就会崩溃,似乎会自动用换行符填充每个输入,同时永远循环。

我尝试使用 std::cin.clear();阻止它自动输入换行符,但这没有用。

#include <iostream>

int main() {
    while (1) {
        std::string operatorChoice;
        long int number1, number2;
        number1 = 0;
        number2 = 0;
        std::cout << "<add>, <subtract>, <divide>, <multiply>, or <exit> ";
        std::cin >> operatorChoice;
        if (operatorChoice == "exit") {
            break;
        }
        std::cout << "Number 1: ";
        std::cin >> number1;
        std::cout << "Number 2: ";
        std::cin >> number2;
        if (operatorChoice == "add") {
            std::cout << number1 << " + " << number2 << " = " << number1 + number2 << "\n";
            std::cout << std::endl;
        }
    }
}

输入:

 add    
 1     
 e   

输出:

1 + 0 = 0    

<add>, <subtract>, <divide>, <multiply>, or <exit> Number 1: Number 2: (this part just repeats forever)

我希望有一种方法可以使循环中的第二次迭代与第一次迭代的行为相同,而不是开始输入换行符。

当给std::cin的输入无法转换成它要写入的变量类型时,就进入错误状态,可以用cin.fail()(或者同义词如!cin).如果是returnstrue(意思是设置了stream的failbit),那么就说明转换失败了。在此失败状态下,cin 将拒绝读取任何数据,直到 failbit 被清除。

在你从用户那里读取数字的行中,你应该使用一个循环来检查流的失败状态,如果是 returns false,则继续正常执行,否则, 调用 std::cin.clear() 清除 failbit 以便 cin 可以像往常一样继续阅读。

请记住,错误的输入仍将存在于流中(即您输入的 'e' 仍将存在,因此如果该输入再次作为 int 读取,它将再次失败),所以调用 std::cin.ignore(<A big number like 256>,'\n') 跳过 bad/faulty 输入,同时提示用户正确输入(传递给 ignore 的数字是它应该跳过的字符数)。 '\n' 参数意味着流中的所有字符在下一行之前都将被忽略,否则用户将不得不输入 256 个字符。