如果在循环中给cin一个意外的输入,则会自动输入C++换行符作为输入
C++ Line break entered as input automatically if you give a cin an unexpected input inside loop
我觉得输入流的缓冲区有问题。每当我为数字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个字符。
相关文章:
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- 如何在出现换行符之前将多个整数作为输入?
- 在字符串中输入换行符
- 使用 fgets() 从键盘读取时从以前的输入读取换行符
- 使用 getline 忽略用户输入中的制表符和换行符
- 如何在C++中检测字符串输入中的换行符
- 在C++中输入时未检测到换行符
- 如果在循环中给cin一个意外的输入,则会自动输入C++换行符作为输入
- 读取整数对,直到文本输入文件中的换行符
- 输入整数直到 C/C++ 中的换行符
- 如何将换行符按钮更改为空格以完成从输入流的读取
- 你能定制一个输入的换行符(C++)吗
- C++清除输入缓冲区(最后没有换行符)
- 使用 getchar() 输入字符的最有效方法,就像 cin 中没有换行符和空格字符一样C++
- 为什么 fstream::tellg() 返回值会因输入文本文件中的换行符数而增大,当文件针对 Windows (r
- 清除包括换行符在内的输入缓冲区
- C++丢弃输入缓冲区问题中剩下的换行符
- c++getline似乎无法识别通过管道传输到stdin的输入中的换行符
- "No newline at end of file"警告,即使在输入换行符后
- 如何在c++中输入换行符