我正在开发菜单驱动的程序,以输出家庭作业的邻接矩阵。在我调用任何其他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;
}
}
}
答案 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
解析您阅读的内容。