切换案例声明不正常吗?

Rhe*_*xis 0 c++ switch-statement

所以我在一个简单的控制台应用程序中制作菜单.我的代码非常多:(与底部的实际代码链接!)

int input;
bool LOOPING = true;

while(LOOPING)
{
cout << "Select an option:\n";
cout << "1 - option 1\n";
cout << "2 - option 2\n";
cout << "3 - option 3\n";
cout << "4 - option 4\n>";
cin >> input;

switch(input) {
    case 1:
        game();
        break;
    case 2:
        game();
        break;
    case 3:
        game();
        break;
    case 4:
        game();
        break;
    default:
        cout << "ERROR: invalid input!\nPlease enter in a number!\n\n";
        break;
}
}
// rest of app...
Run Code Online (Sandbox Code Playgroud)

我的问题是,程序只是进入一个恒定的文本循环!为什么会这样?为什么不default:阻止这种情况发生?如何阻止这种情况发生?

提前致谢!

编辑:要求真正的代码.

http://pastie.org/2415852
http://pastie.org/2415854
http://pastie.org/2415855
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 7

您的代码无限循环,因为您从未设置LOOPING为false.在实际代码中,您只在用户选择退出时将其设置为false,这将永远不会发生,因为用户在第一次输入非数字后无法再输入输入.

在输入字符后它不会一直要求您输入的原因是>>不消耗无效输入.即如果>>应该写入一个int,但是用户输入的内容不是有效的int,它不会写入int,但它也不会从流中删除用户输入(相反它只会设置cin错误标志) ,你应该检查).

输入将保留在流中,直到您将其写入其他位置或丢弃它.在您执行此操作之前,每次后续尝试读取int都将失败,因为无效输入仍在流中.

  • 并清除`cin`缓冲区(你必须在`default`中做些什么:http://stackoverflow.com/questions/257091/how-do-i-flush-the-cin-buffer) (2认同)
  • @Flyphe:是的,如果输入数字,该数字将存储在int中,然后从流中删除.因此,下次尝试从流中读取时,流将为空,并且将要求用户输入.但是当你输入一个字符时,正如我所说,输入不会从流中删除(因为它无法写入int).所以下次你尝试从流中读取时输入仍然存在,而`>>将尝试再次解析它,它将失败.... (2认同)