带有输入的C++无尽循环

C++ Endless loop with input

本文关键字:无尽 循环 C++ 输入      更新时间:2023-10-16

我有一个C++程序,它从终端接收输入,由于某种原因,这会产生一个无休止的循环:

double getSideLength()
{
    cout << "Enter a side: "
double side;
cin >> side; cin.ignore( 80, 'n' );
while (side <= 0){
    cout << "Please enter a valid side. Try again: ";
    cin >> side; cin.ignore(80, 'n');
}
return side;

这会产生输出:

Enter a side: invalid
Please enter a valid side. Try again:
Please enter a valid side. Try again:
Please enter a valid side. Try again:
   .... and so on. "invalid" is the only input the user made

如operator>>中所述,如果"所获得的输入无法解释为适当类型的元素",则文档流将启用其故障位。如果输入错误的数字,则会发生这种情况。所以您只需要在下一个输入之前清除()cin。这是代码:

double getSideLength()
{
        double side;
        cout << "Enter a side: ";
        cin >> side;
        if (!cin)
             cin.clear();
        cin.ignore( 80, 'n' );
        while (side <= 0){
                cout << "Please enter a valid side. Try again: ";
                cin >> side;
                if (!cin)
                    cin.clear();
                cin.ignore( 80, 'n' );
        }
        return side;
}

这应该可以解决问题。使用!(cin >> side)将确保我们从cin中获得正确的类型。

double getSideLength()
{
    cout << "Enter a side: " << std::endl;
    double side = -1;
    while ( ! (cin >> side) and side <= 0)
    {
        cout << "Please enter a valid side. Try again: ";
        cin.clear();
        cin.ignore(1000, 'n');
    }
    return side;
}

cin似乎有很多复杂之处,通常,正如这里所解释的,您最好使用getline,然后使用atoi

此外,这里还讨论了无限循环的问题。如果您想使用cin,可以将输入转换为字符串变量,然后使用atoi将其转换为整数,如本文所示。

double getSideLength()
{
    double side;
 getinput:
    cout << "Enter a side: "
    cin >> side; cin.ignore( 80, 'n' );
    if(side <= 0)
    {
        cout << "Please enter a valid side. Try again: "
        goto getinput;
    }
    return side;
}