c++ - cin和 switch 奇怪行为

  显示原文与译文双语对照的内容
0 0

所以我在使用 cinswitch 语句时遇到一些问题。 首先,程序提示输入 int:

cout <<"How many registers would you like to use?:";
cin>> kassor;

稍后,用户将被要求做出选择:

 cout <<endl <<"Press "S" to run the queue simulator and/or make a timestep." <<endl;
 cout <<"Press "Q" to quit." <<endl <<endl;
 cout <<"Choice:";
 cin>> choice;
 switch (choice)
 {
 case 's':
 case 'S':
 {
 cout <<"test";
 nya = newCustomers();
 break;
 }
 case 'q':
 case 'Q':
 {
 return 0;
 }
 }

在这里,'q'选项正常运行,但'选项 does 。 它是'挂起',好像仍然在等待输入。 我尝试过各种 cin.ignore(),但没有用。

让我困惑的是

switch (choice)
{
 case 's':
 case 'S':
 {
 cout <<"test";
 nya = newCustomers();
 break;

不给出任何内容,但以下情况除外:

switch (choice)
 {
 case 's':
 case 'S':
 {
 cout <<"test";
 cin.ignore(1024, 'n');
 nya = newCustomers();
 break;

输出'测试'。

我的主要问题是: 问题是 cin 还是 case: s 里的东西?

在致谢中:

时间:原作者:6个回答

0 0

看起来函数 newCustomers 在输入 choice 之后被挂起了,或者者两个字母都被挂起了。 这将解释为什么 ignore 调用"修正"问题,并且在注释中提供了 @TheBuzzSaw. 中建议的解决方案

要更清楚地看到这一点,请更改

cout <<"test";

cout <<"testn";

或者

cout <<"test" <<std::endl;

在某些系统上,控制台是行缓冲的,所以在程序写完换行之前,你不会看到任何输出。 插入 endl 会刷新输出缓冲区,因此即使后面的代码挂起,也应该看到消息。 或者将它的更改为:

cerr <<"testn";

cerr 更加积极地对冲洗缓冲区,因为它是用于错误输出,你不想错过。

原作者:
0 0

我认为这可能是错误的原因,我无法确定它的代码。

我无法发表评论,所以我想我应该在这里发布。 这个"悬挂"可能是无限循环。 如果你做什么像我做的和循环,以获得输入,并没有清楚错误的位will不断失败。 如果你每次要求输入时都不会发生什么,那么它可以以静静地坐在那里循环。 在所有循环中放置断点,并通过调试器来验证你的循环没有无限循环。

尝试添加 std:: cin,清除( ) ;在第二个测试用例的. ignore() 之前。 看看能不能把你挂下来。

解释:

cin可能会失败这可能会导致奇怪的行为。 一种常见的方法是,如果你正在读入整数,你就得到了字符输入。 一旦cin失败,设置一个失败位和从那时起,cin不像你预期的那样。

我建议不要使用白色的>> 选择,因为它可以能会失败,你不会知道它。 我将这个抽象到一个得到你想要的正确输入的方法。

我个人保持一个微小的实用程序 library(.h) 和. cpp 包括在我使用公共功能的项目中。

我有一个 readIntBetween() 函数,它接受 2个整数,从标准输入中读取两个数之间的整数。 如果用户没有提供正确的输入( 。整数超过或者低于边界,或者输入包含字符),我要求他们输入输入。

在这个函数中,我确保在检测到失败时清除失败位,并忽略类似 200字符的内容。

下面是我的readIntBetween函数的代码。 我希望它有助于你诊断错误并修复错误:

int readIntBetween(int lower, int upper, std::string prompt)
{
 bool goodVal = false;
 int value = -1;
 do
 {
 std::cout <<prompt ;
 std::cin>> value;
 if ( value> = lower && value <= upper)//check to make sure the value is in between upper and lower
 goodVal = true;
 else
 {
 if(std::cin.fail())
 {
 std::cout <<"tError - invalid format for integer number" <<std::endl;
//clear all status bit including fail bit
 std::cin.clear();
//flush input buffer to discard invalid input
 std::cin.ignore(1000, 'n');
 }
 else
 std::cout <<"Value is not valid, must be between" <<lower<<" and"<<upper<<"."<<std::endl;
 }
 }while(!goodVal);
 return value;
}
原作者:
0 0

如果你的cin 正在循环中使用,我建议采用不同的方法。

char buffer[64];
cin.getline(buffer, 64);
char choice = buffer[0];
switch (choice)
{
. . .
}

你的cin 可能没有被重置,任何无关的字符都被输入到后续的输入请求中。 获取更多的输入,只处理它的第一个字符。

原作者:
...