While 循环奇怪地响应非整数

Posted

技术标签:

【中文标题】While 循环奇怪地响应非整数【英文标题】:While loop responds strangely to non integer 【发布时间】:2017-07-26 20:59:49 【问题描述】:

所以我在测试时遇到问题,以确保 while 循环正常工作。如果为cin

int a;
cout << "What type of game do you wish to  play?\n(Enter the number of the menu option for)\n(1):PVP\n(2):PvE\n(3):EVE\n";
cin >> a;
while (!((a == 1) || (a == 2) || (a == 3)))

    cout << "That is not a valid gametype. Pick from the following menu:\n(1):PVP\n(2):PvE\n(3):EVE\n";
    a = 0;
    cin >> a;

【问题讨论】:

哇,这么多括号!您不需要单独的 == 测试周围的那些,您可以通过应用德摩根定理摆脱三个测试周围的一对:while (a != 1 &amp;&amp; a != 2 &amp;&amp; a != 3) 更容易阅读...... 【参考方案1】:
cin >> a;

如果此代码失败(如果您提供非整数数据也会失败),流将进入无效状态,并且所有随后对 cin &gt;&gt; a 的调用将立即返回,没有副作用,仍处于错误状态.

这是我不特别喜欢的 C++ 设计决策(这可能是大多数人不喜欢 C++ 中的 Streams 设计的原因),因为您希望这会引发错误或之后恢复正常,例如大多数其他语言。相反,它会默默地失败,这是许多程序错误的最大来源。

无论如何,有两种可能的解决方法。

首先是正确检查流是否仍然有效。像这样:

while (!((a == 1) || (a == 2) || (a == 3)))

    cout << "That is not a valid gametype. Pick from the following menu:\n(1):PVP\n(2):PvE\n(3):EVE\n";
    a = 0;
    if(!(cin >> a)) break; //Input was invalid; breaking out of the loop.

如果输入无效,这将中断循环,但会使流处于无效状态。

另一个解决方法是将流重置为有效状态。

while (!((a == 1) || (a == 2) || (a == 3)))

    cout << "That is not a valid gametype. Pick from the following menu:\n(1):PVP\n(2):PvE\n(3):EVE\n";
    a = 0;
    while(!(cin >> a)) 
        std::cin.clear();
        std::cin.ignore(numeric_limits<streamsize>::max(), '\n');
        std::cout << "Please only enter Integers." << std::endl;
    

第二种方法通常是人们需要的方法,但在某些情况下第一种方法更有意义。

【讨论】:

当然,您可以随意不喜欢 C++ 流的设计,但您不应该声称代表“大多数人”,尤其是当您的反对意见采取明确表明您的陈述形式时不知道设计目标是什么,也不知道如何正确使用它们。【参考方案2】:

我让它工作了:

    int a;
cout << "What type of game do you wish to  play?\n(Enter the number of the menu option for)\n(1):Player V Player\n(2):Player vComp\n(3):Comp V Comp\n";
cin >> a;
while (a != 1 && a != 2 && a != 3 || cin.fail())

    cout << "That is not a valid gametype. Pick from the following menu:\n(1):Player V Player\n(2):Player vComp\n(3):Comp V Comp\n";
    cin.clear();
    cin.ignore(256, '\n');
    cin >> a;

【讨论】:

以上是关于While 循环奇怪地响应非整数的主要内容,如果未能解决你的问题,请参考以下文章

带有字符串而不是整数的 while 循环

Python整数在循环中表现得很奇怪

C While 循环用于整数数组

cin >> 整数和 while 循环

Javascript - while 循环间歇性地无限运行?

带有空主体的while循环检查易失性整数-这是啥意思?