在c ++中切换case无限循环错误

时间:2016-04-20 01:22:41

标签: c++ switch-statement infinite-loop

我正在开发菜单驱动的程序,以输出家庭作业的邻接矩阵。在我调用任何其他4个案例之后我将一个字符作为我的输入时,我的循环无限地运行,我无法弄清楚原因。

如果我将案例5激活,则会发生这种情况。

但是如果我输入一个字符作为第一个输入,那么它会按预期正确关闭。

我逐步调试了调试器,似乎如果输入一个字符,它将输入为4并且从不接受另一个输入,因此它会一直反复打印数组。

有谁可以解释这个功能有什么问题?我这里只有这个功能,因为整个程序大约有300行,不包括注释。但通过一些测试,我将我的错误缩小到这个特定的功能,其他人做了他们想要的。

    void menu(char graph[][8])
{
    bool run = true;
    while (run == true)
    {
        int menuChoice;
        cout << "Welcome to the menu" << endl;
        cout << "Pick one of the following" << endl;
        cout << "1. add connection" << endl;
        cout << "2. delete connection " << endl;
        cout << "3. show total number of connections " << endl;
        cout << "4. show matrix " << endl;
        cout << " 5. to exit" << endl;
        cout << "Selection : ";
        cin >> menuChoice;
        switch (menuChoice)
        {
        case 1: addConnection(graph);
            break;
        case 2: deleteConnection(graph);
            break;
        case 3: showConnection(graph);
            break;
        case 4: showMatrix(graph);
            break;
        /*case 5:
            cout << "Exiting ...\n";
            run = false;
            break;*/
        default:
            cout << "Improper input " << endl; // for some reason this flies into infinite when a character is entered.
            cout << "Exiting ...\n";
            run = false;
            break;

        }
    }
}

1 个答案:

答案 0 :(得分:5)

这是一个教科书案例,为什么operator>>永远不应该处理交互式的面向行的输入。

如果你的意图是输入一行文字,那就是std::getline()的用途。

此代码在operator>>上使用int

  

如果输入字符,则输入为4

不,它没有。 operator>>转换失败。 menuChoice未初始化,包含随机垃圾。它可能是'4',它可能是'X',它可能是一些不可打印的字符。天空是极限。

但更重要的是,std::cin现在已经设置了失败位,并且任何进一步尝试从std::cin读取都将失败,直到流状态为clear()ed。代码永远不会这样做,并且只是一遍又一遍地循环,徒劳地尝试operator>>下一个字符,当然,由于流处于失败状态,它不会做任何事情。由于代码不检查输入流的状态,因此不知道发生了什么。

请勿使用operator>>阅读std::cin。如果您想阅读一行文字,请使用std::getline(),并使用独立的std::istringstream解析您阅读的内容。