This question already has answers here:
Infinite loop with cin when typing string while a number is expected

(4个答案)


4年前关闭。




我想知道是否有人可以告诉我下面的代码为什么?
int main ()
{

        while((true))
        {
            int userChoice;
            //fprintf(stdout, "Press 1 for Coke.\nPress 2 for Sprite.\nPress 3 for Dr. Pepper.\nPress 4 for Mountain Dew.\nPress 5 for Monster.\nPress 6 for Help.\n\n");

            fprintf(stdout, "What would you like? (Press 6 for assistance): ");
            std::cin >> userChoice;
            if ((userChoice == 1))
            {
                fprintf(stdout, "\nYou get a Coke and you get a Coke, EVERYONE GETS A COKE!\n\n");
            }
            else if ((userChoice == 2))
            {
                fprintf(stdout, "\nDispensing Sprite.\n\n");
            }
            else if ((userChoice == 3))
            {
                fprintf(stdout, "\nDropping the Dr. P!\n\n");
            }
            else if ((userChoice == 4))
            {
                fprintf(stdout, "\nDo the Dew!\n\n");
            }
            else if ((userChoice == 5))
            {
                fprintf(stdout, "\nHere's your Monster, but don't go crazy\n\n");
            }
            else
            {
                fprintf(stdout, "\nPress 1 for Coke.\nPress 2 for Sprite.\nPress 3 for Dr. Pepper.\nPress 4 for Mountain Dew.\nPress 5 for Monster.\nPress 6 for Help.\n\n");
            }
        }

}

当通过std::cin接收到非整数时,将导致无限循环而不是打印“else”语句。

我假设这是因为userChoice被存储为整数。我如何防止这种情况发生?首先猜测是将其更改为字符串或字符,但想要更好的解释...

先感谢您。

编辑:从评论;

感谢您的回答和输入;
  • 如果不是,则使用if代替switch语句是“学习”的一部分。即时通讯是全新的,“初学者挑战”希望在if中使用它,然后将其更改为使用开关。
  • 括号,Code::Blocks抛出编译器警告,所以我添加了它们...
  • 使用不同的printf / scanf等是有意义的。

  • 也许我应该问更具体些;为什么当我输入“6”时,它会正常中断并返回到循环的顶部,但是当我输入“a”时,它会尽可能快地反复打印else语句

    最佳答案

    简短答案:如果您进行了正确的错误检查,那么您已经知道答案了。 (或者至少比您现在更近)

    由于userChoice的类型为int,因此答案很长:std::cin >> userChoice; 在尝试解析a时使失败。它对userChoice的值不执行任何操作,并在std::cin上设置失败位。

    由于userChoice保留了先前的值,因此它只会重复执行先前的选择。

    此外,下次执行std::cin >> userChoice;时,您将在仍处于失败状态的流上执行该操作,因此该操作不再执行任何操作。

    解决:测试错误。并且,如果您的错误处理决定继续循环,请确保清除标志以使std::cin返回良好状态。

    关于c++ - 字符类型导致循环爆炸,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37837434/

    10-10 03:46