【问题标题】:C++ Endless loop with input [duplicate]带有输入的C ++无限循环[重复]
【发布时间】:2012-03-06 13:19:36
【问题描述】:

我有一个从终端获取输入的 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

【问题讨论】:

  • 忽略子句有什么用?

标签: c++ loops while-loop infinite-loop


【解决方案1】:

operator>> documentation 中所说,如果“获得的输入无法解释为适当类型的元素”,则流将其故障位打开。如果您输入错误的号码,就会发生这种情况。所以你只需要在下一次输入之前 clear() 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;
}

【讨论】:

    【解决方案2】:

    这应该可以解决问题。使用 !(cin &gt;&gt; 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;
    }
    

    【讨论】:

      【解决方案3】:

      cin 似乎有很多错综复杂的地方,一般来说,正如here 所解释的那样,您最好先使用 getline,然后再使用 atoi

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

      【讨论】:

        【解决方案4】:
        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;
        }
        

        【讨论】:

        • 你不应该在你的代码中使用 goto 子句。
        • 对不起,为什么?我不是 C++ 大师,我想知道原因。谢谢...
        • @Pochi:它们可能难以阅读、遵循和维护,但它们没有任何错误(甚至 MS 示例都有它们),编译器将执行所有循环无论如何都要计算跳跃。
        • goto 被认为是糟糕的风格。它背后的基本原理是,您可以使用 while 循环和continues 来完成相同的操作,这使得代码可读。没有人在任何类型的可展示的 C++ 代码中使用 goto 子句。 @Necrolis:这违背了您使用高级语言编写代码的原因之一——抽象。你也可以用汇编程序编写代码。
        • 我只是认为这很好,因为它是一个小功能......但我认为他的这部分代码 cin >> 方面存在问题; cin.ignore(80, '\n'); 无法测试
        猜你喜欢
        • 2020-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-29
        • 1970-01-01
        • 1970-01-01
        • 2016-07-29
        相关资源
        最近更新 更多