当while循环执行时,会出现一些非常奇怪的错误



所以我基本上是在写基于海战主机的游戏。我实际上是在为游戏菜单编写函数。执行时一切正常,除了一些奇怪的小故障。

  • 当我输入一个无效的float值,该值包含从1到4的数字作为有效位(例如7.4(时,它会显示一条标准错误消息,但也会执行与该数字对应的命令(7.4会触发一条错误消息,但是过一段时间后会退出程序,就好像用户输入了数字"4"作为输入一样,任何x.[1-4]数字也是如此(
  • 当用户输入几个错误类型的无效字符作为输入时,会出现另一个奇怪但无害的小故障。例如,如果用户输入"!!!!",那么控制台将在要求另一个输入之前显示6次错误消息

这是出现问题的代码片段。案例1到案例3还没有完成,所以它们现在是空白的。

std::cout << "Press a corresponding number for each action you want to do.nn1. Play Gamen2. Instructionsn3. Optionsn4. Exitnn";
short int PlayerChoice;
std::cin >> PlayerChoice;
while (PlayerChoice != 1 && PlayerChoice != 2 && PlayerChoice != 3 && PlayerChoice != 4) // In case the user will enter the invalid/incorrect input or number
{ 
std::cin.clear();
std::cin.ignore(); // Prevents infinite loop from happening if user enters a char value
std::cout << "Wrong input, please input a correct number between 1 and 4 (inclusive)n";
std::cin >> PlayerChoice;
}
switch (PlayerChoice){
case 1:
Sleep(850);
break;
case 2:
Sleep(850);
break;
case 3:
Sleep(850);
break;
case 4:
Sleep(850);
std::cout << "You have decided to exit the game.n";
Sleep(1500);
std::cout << "Thanks for playing and hope to see you soon!";
Sleep(3000);
exit(0);
break;
default: // This section actually isn't supposed to be executed under any circumstances
std::cout << "Unexpected error occured. Terminating the programme.";
break;
}

为了更清楚起见,下面是我的意思的截图。

我对C++还比较陌生,所以任何一位C++教授都能解释这些错误的性质,并就如何修复这些错误给我一些建议吗?非常感谢!

首先,通常不建议直接使用std::cin >> PlayerChoice;。它不检查用户输入错误。相反,最好使用std::cin.getline()并检查整行的语法。例如,如果用户输入"2 3 1 5 4","2"将进入以触发选项2,但所有剩余的输入都被缓冲。之后,您的下一个整数std::cin将收到"3",而无需再次询问用户。

你得到的结果对我来说很奇怪,但我试着解释一下:

当输入7.4时,由于您的程序指示它接收一个整数,7会进入。因此它会打印您的"错误输入…"错误消息。但在下一个循环中,您的std::cin.ignore()不会清除缓冲区(这就是我不知道为什么的原因。根据std::cin.ignored()手册,它应该清除。)然后,"."被忽略,因为它不是一个数字,并且"4"被输入。它会触发你的选项"4"来结束程序。

事实上,如果将std::cin.ignore()更改为std::cin.ignore('n'),它是有效的。

更新:现在我知道为什么你的std::cin.ignore()不起作用了:根据手册,如果没有提供第一个参数,即nn = 1。因此,您忽略了1个字节。请阅读std::basic_istream::ignore手册。

相关内容

  • 没有找到相关文章

最新更新