为什么 while 循环会无限重复?
Why does this do while loop repeat infinitely?
我想提示用户输入一个整数,但如果用户输入一个非整数,程序会一直要求输入一个整数,直到用户同意为止。
int getInteger(){
int input;
do{
std::cout << "Enter an integer: ";
std::cin >> input;
} while(!(std::cin));
return input;
}
如果用户输入整数,函数returns就可以了。
但如果用户输入类似 "Hello," 的内容,该函数将无限期地 cout
-ing "Enter an integer: ".
我该如何解决这个问题?
流转换为 true
,同时设置了 none 个故障位。一旦流进入故障状态,即为流设置 std::ios_base::failbit
(或 std::ios_base::badbit
),它将保持该状态,直到使用 clear()
清除故障位。除了清除声明之外,您还需要摆脱导致它进入此状态的违规字符,例如,使用 ignore()
.
!(std::cin)
如果 std::cin
处于不良状态,例如 将评估为真输入操作失败后。然后,所有后续输入操作将立即失败,并且不会改变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 for ignore
上。然而,这不应该像你的玩具程序那样咬你。
我想提示用户输入一个整数,但如果用户输入一个非整数,程序会一直要求输入一个整数,直到用户同意为止。
int getInteger(){
int input;
do{
std::cout << "Enter an integer: ";
std::cin >> input;
} while(!(std::cin));
return input;
}
如果用户输入整数,函数returns就可以了。
但如果用户输入类似 "Hello," 的内容,该函数将无限期地 cout
-ing "Enter an integer: ".
我该如何解决这个问题?
流转换为 true
,同时设置了 none 个故障位。一旦流进入故障状态,即为流设置 std::ios_base::failbit
(或 std::ios_base::badbit
),它将保持该状态,直到使用 clear()
清除故障位。除了清除声明之外,您还需要摆脱导致它进入此状态的违规字符,例如,使用 ignore()
.
!(std::cin)
如果 std::cin
处于不良状态,例如 将评估为真输入操作失败后。然后,所有后续输入操作将立即失败,并且不会改变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 for ignore
上。然而,这不应该像你的玩具程序那样咬你。