C++ 意外无限循环

C++ 意外无限循环,c++,C++,我偶然发现了这个无限循环。我应该检查用户的输入不是整数以外的任何类型,也不是负数。 为什么我会得到这个无限循环,更重要的是我如何对输入施加这些限制 #include <iostream> using namespace std; int main(){ long long int m, k; cin >> m >> k; while (cin.fail() || m < 0 || k < 0){ cin.c

我偶然发现了这个无限循环。我应该检查用户的输入不是整数以外的任何类型,也不是负数。 为什么我会得到这个无限循环,更重要的是我如何对输入施加这些限制

#include <iostream>
using namespace std;

int main(){
    long long int m, k;
    cin >> m >> k;
    while (cin.fail() || m < 0 || k < 0){
        cin.clear();
        cout << "please enter another input";
        cin >> m >> k;
    }

return 0;
}
#包括
使用名称空间std;
int main(){
长整型m,k;
cin>>m>>k;
while(cin.fail()| | m<0 | | k<0){
cin.clear();
cout>m>>k;
}
返回0;
}
如果
cin.fail()
是真的-我们很乐意继续循环

第一次尝试读取两个失败的数字后,请清除状态并重试。这是没有阅读有问题的项目。当数据留在流中时,它肯定会再次失败


您需要添加这样的逻辑,即在读取失败时,您可以采取适当的操作-例如读取有问题的数据

如果操作员
>
由于输入与目标类型不匹配而失败,则字符仍保留在流中(即使清除了失败位)。 因此,如果您一次又一次重复相同的读取操作,它将一次又一次失败。在这种情况下,通常会跳过/忽略字符。以下示例直接取自:

intmain()
{
std::istringstream输入(“1\n”
“某些非数字输入\n”
“2\n”);
对于(;;){
int n;
输入>>n;
if(input.eof()| | input.bad()){
打破
}else if(input.fail()){
input.clear();//取消设置故障位
input.ignore(std::numeric_limits::max(),'\n');//跳过错误的输入
}否则{
标准::cout
int main()
{
    std::istringstream input("1\n"
                             "some non-numeric input\n"
                             "2\n");
    for(;;) {
        int n;
        input >> n;

        if (input.eof() || input.bad()) {
            break;
        } else if (input.fail()) {
            input.clear(); // unset failbit
            input.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip bad input
        } else {
            std::cout << n << '\n';
        }
    }
}