char类型导致循环爆炸

时间:2016-06-15 13:50:15

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

我想知道是否有人能告诉我为什么以下代码;

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收到非整数时的语句。

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

提前谢谢。

编辑:来自评论;

感谢您的回答和输入;

  • if'而不是switch语句是" Learning"的一部分。我是全新的,初学者挑战"如果想要它,然后改变它以使用开关。

  • 括号,Code :: Blocks正在抛出编译器警告,所以我添加了它们......

  • 使用不同的printf / scanf等是有道理的。

也许更具体地说我应该问;为什么当我输入" 6"时,它会正确地断开并返回到循环的顶部,但是当我输入" a"它会尽快重复打印出else语句

3 个答案:

答案 0 :(得分:4)

  1. 当您使用*printf时,最好与scanf( "%d", &userChoice )结合使用,而不是cin;

  2. 使用printf( <format>, <arg )代替fprintf( stdout, ... - 它是相同的;

  3. 有许多不必要的括号:while ((true))if ((userChoice == x));

  4. 要获得更具可读性的语法,请使用switch - case代替所有这些if - s;

  5. 无限循环似乎与while ( true )一样,没有break也不return

答案 1 :(得分:1)

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

userChoice类型为int时的长答案:std::cin >> userChoice; 在尝试解析a时失败 。它对userChoice的值没有任何作用,并在std::cin上设置失败位。

由于userChoice保留了之前的值,它只是重复之前选择的任何内容。

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

修复:测试错误。如果您的错误处理决定继续循环,请确保清除标志以使std::cin恢复正常状态。

答案 2 :(得分:0)

简单程序的简单解决方案:

std::cin >> userChoice;  // insert the following lines
if (std::cin.fail())
{
  std::cin.clear(std::ios::goodbit);
  char c;
  std::cin >>c;
}