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

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

本文关键字:输入 换行符 C++ 意外 循环 cin 一个 如果      更新时间:2023-10-16

我觉得输入流的缓冲区有问题。每当我为数字1或数字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等同义词)进行查询。如果返回true(表示流的failbit已设置),则表示转换失败。在这种失败状态下,cin将拒绝读取任何数据,直到failbit被清除。

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

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