C++ c+中的开关盒无限循环错误+;

C++ c+中的开关盒无限循环错误+;,c++,switch-statement,infinite-loop,C++,Switch Statement,Infinite Loop,我正在编写一个菜单驱动程序,为家庭作业输出邻接矩阵。当我在调用其他4种情况中的任何一种后,输入一个字符作为输入时,我的循环无限运行,我不知道为什么 无论案例5是否处于活动状态,这种情况都会发生 但是,如果我输入一个字符作为第一个输入,那么它将按预期正确关闭 我逐步调试了调试器,似乎如果输入了一个字符,它会将该输入值设为4,而不会再输入另一个字符,因此它会反复打印数组 有人能解释一下这个函数的错误吗?我这里只有这个函数,因为整个程序大约有300行,不包括评论。但是通过一些测试,我已经将我的bug缩

我正在编写一个菜单驱动程序,为家庭作业输出邻接矩阵。当我在调用其他4种情况中的任何一种后,输入一个字符作为输入时,我的循环无限运行,我不知道为什么

无论案例5是否处于活动状态,这种情况都会发生

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

我逐步调试了调试器,似乎如果输入了一个字符,它会将该输入值设为4,而不会再输入另一个字符,因此它会反复打印数组

有人能解释一下这个函数的错误吗?我这里只有这个函数,因为整个程序大约有300行,不包括评论。但是通过一些测试,我已经将我的bug缩小到了这个特定的功能,其他人做他们想做的事情

    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;

        }
    }
}
void菜单(字符图[][8])
{
bool run=true;
while(run==true)
{
国际货币基金组织;

cout这是一个教科书案例,说明为什么
操作员>>
永远不应该处理面向行的交互式输入

如果您的目的是输入一行文本,那么这就是
std::getline
()的用途

此代码在
int
上使用
运算符>>

如果输入一个字符,则该输入为4

不,它没有。运算符转换失败。
菜单未初始化,包含随机垃圾。它可能是“4”,可能是“X”,可能是一些无法打印的字符。天空是极限

但更重要的是,
std::cin
现在已经设置了失败的位,任何进一步尝试从
std::cin
读取的操作都将失败,直到流状态为
clear
()ed.代码从来没有这样做过,只是一次又一次地循环,徒劳地尝试
操作符>>
下一个字符,当然,由于流处于失败状态,它什么也不做。而且由于代码没有检查输入流的状态,它不知道发生了什么


不要使用
operator>
阅读
std::cin
。如果您想阅读一行文本,请使用
std::getline()
,并使用独立的
std::istringstream

解析您所阅读的内容。这是一个教科书案例,说明了为什么
operator>
永远不应该处理交互式面向行的输入

如果您的目的是输入一行文本,那么这就是
std::getline
()的用途

此代码在
int
上使用
运算符>>

如果输入一个字符,则该输入为4

不,它没有。运算符转换失败。
菜单未初始化,包含随机垃圾。它可能是“4”,可能是“X”,可能是一些无法打印的字符。天空是极限

但更重要的是,
std::cin
现在已经设置了失败的位,任何进一步尝试从
std::cin
读取的操作都将失败,直到流状态为
clear
()ed.代码从来没有这样做过,只是一次又一次地循环,徒劳地尝试
操作符>>
下一个字符,当然,由于流处于失败状态,它什么也不做。而且由于代码没有检查输入流的状态,它不知道发生了什么


不要使用
operator>
读取
std::cin
。如果要读取一行文本,请使用
std::getline()
,并使用独立的
std::istringstream

解析您阅读的内容。无法使用MCVE复制:如果我正确理解问题,当您在执行
cin>>menuChoice
(即
int
)时提供非数字输入,你会永远循环吗?实际上它对我很有效。所以我想问题在于你通过cast 1调用的函数。。。4@mah如果我插入1-4,它运行函数并返回菜单,则不太可能运行中断,然后再次返回并请求输入。在第二次输入时,如果我输入字符,调试器会将其读取为4,如果它是非数字。a它永远循环。它停止接受输入并保持4,在案例4中运行函数并不断重复。试图将其放入键入的解释中是多么奇怪。@Hikari您可以通过删除所有的添加/删除/显示函数来做一个简单的测试,即只保留案例1…4的中断。然后您可以进行一个只包含“菜单”的测试。您介意吗e尝试?无法用MCVE再现:如果我正确理解问题,当您在执行
cin>>菜单提示时提供非数字输入时(这是一个
int
),你会永远循环吗?实际上它对我很有效。所以我想问题在于你通过cast 1调用的函数。。。4@mah如果我插入1-4,它运行函数并返回菜单,则不太可能运行中断,然后再次返回并请求输入。在第二次输入时,如果我输入字符,调试器会将其读取为4,如果它是非数字。a它永远循环。它停止接受输入并保持4,在案例4中运行函数并不断重复。试图将其放入键入的解释中是多么奇怪。@Hikari您可以通过删除所有的添加/删除/显示函数来做一个简单的测试,即只保留案例1…4的中断。然后您可以进行一个只包含“菜单”的测试。您介意吗尝试一下?我考虑过,但我不想读文本,我只想要整数,但如果我的评分员在运行函数后输入一个字符来测试它,它就会中断。如果我使用
getline(cin,input)当menuChoice的类型为
int
时,menuChoice将如何被初始化?不会。正确处理无效输入仍然是您的责任。但至少您不必担心
std::cin
的状态变得混乱。那么,您打算让我如何处理无效输入的情况呢关于char的ut?第一件事