我想提示用户输入一个整数,但如果用户输入一个非整数,程序应该一直要求一个整数,直到用户符合。
int getInteger(){
int input;
do{
std::cout << "Enter an integer: ";
std::cin >> input;
} while(!(std::cin));
return input;
}
如果用户输入一个整数,该函数将返回它。
但是如果用户输入类似“Hello”的内容,则该函数会进行无限的cout
- “输入一个整数:”。
我该如何解决这个问题?
答案 0 :(得分:5)
!(std::cin)
如果std::cin
处于不良状态,将评估为true,例如输入操作失败后。然后,所有后续输入操作将立即失败,并且不会更改cin
的错误状态,从而无限循环。
要获得所需的行为,您可以使用类似
的内容while (!(std::cin >> input)) {
std::cout << "Try again\n";
// Clear away the error state
std::cin.clear();
// Ignore what ever garbage is still in the stream
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
在现实世界中,您可能希望处理(通常不可恢复的)失败eof
(有人发送了文件结尾字符)并且bad
(cin
已损坏,应该没有发生)与无效输入后发生的fail
不同。例如,this reference page显示ignore
。但是,这不应该像你的玩具程序那样咬你。
答案 1 :(得分:3)
Streams转换为true
,而没有设置任何失败位。一旦流进入故障状态,即为流设置std::ios_base::failbit
(或std::ios_base::badbit
),它将保持该状态,直到使用clear()
清除故障位。除了清除陈述之外,您还需要摆脱导致它进入此状态的违规字符,例如,使用ignore()
。