C++ 执行while循环时会出现一些非常奇怪的错误
所以我基本上是在编写基于海战控制台的游戏。我实际上是在为游戏菜单编写函数。它在执行时工作正常,除了一些奇怪的小故障C++ 执行while循环时会出现一些非常奇怪的错误,c++,validation,debugging,while-loop,switch-statement,C++,Validation,Debugging,While Loop,Switch Statement,所以我基本上是在编写基于海战控制台的游戏。我实际上是在为游戏菜单编写函数。它在执行时工作正常,除了一些奇怪的小故障 当我输入一个无效的float值,该值包含1到4的数字作为其有效位(例如7.4),它会显示一条标准错误消息,但也会执行与该数字对应的命令(7.4将触发一条错误消息,但过一段时间后退出程序,就像用户输入的数字“4”一样作为一个输入,任何x[1-4]数字都是相同的) 当用户输入几个错误类型的无效字符作为输入时,会出现另一个奇怪但无害的小故障。例如,如果用户输入“!!!!!”,则控制台将
- 当我输入一个无效的float值,该值包含1到4的数字作为其有效位(例如7.4),它会显示一条标准错误消息,但也会执行与该数字对应的命令(7.4将触发一条错误消息,但过一段时间后退出程序,就像用户输入的数字“4”一样作为一个输入,任何x[1-4]数字都是相同的)
- 当用户输入几个错误类型的无效字符作为输入时,会出现另一个奇怪但无害的小故障。例如,如果用户输入“!!!!!”,则控制台将在请求其他输入之前显示错误消息6次李>
std::cout << "Press a corresponding number for each action you want to do.\n\n1. Play Game\n2. Instructions\n3. Options\n4. Exit\n\n";
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;
}
std::cout>PlayerChoice;
while(PlayerChoice!=1&&PlayerChoice!=2&&PlayerChoice!=3&&PlayerChoice!=4)//以防用户输入无效/不正确的输入或数字
{
std::cin.clear();
std::cin.ignore();//防止在用户输入字符值时发生无限循环
标准::cout>PlayerChoice;
}
开关(播放器选择){
案例1:
睡眠(850);
打破
案例2:
睡眠(850);
打破
案例3:
睡眠(850);
打破
案例4:
睡眠(850);
std::cout首先,通常不建议直接使用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())
manual。)然后,“.”表示忽略,因为它不是一个数字,“4”进入。它会触发选项“4”以结束程序
事实上,如果您将std::cin.ignore()
更改为std::cin.ignore('\n')
,它会工作
更新:
现在我知道为什么你的std::cin.ignore()
不起作用:根据手册,如果没有提供第一个参数,即n
,则n=1
。因此,您只忽略了1个字节。请阅读std::basic\u istream::ignore
手册。建议:构造一个简单的程序,它只获取用户输入(a)你的开发环境应该会出现(如果没有不同的开发环境的话),这是一种工具,可用于控制程序的执行并检查其变量。在最低级别,您可以逐个指令执行程序指令,并查看其功能和原因。删除“short”“未更改任何内容。我尝试将其更改为char和int。但谢谢,我将逐步查看它并为您提供更多详细信息。//如果用户输入一个char值,则可防止发生无限循环。
,如果用户输入6个char值,将如何处理?如果有人输入6个char值,则会显示6条错误消息。”(正如我在上面的帖子中解释的)并要求用户提供有效的输入。除了显示6次错误消息之外,一切正常(与字符或特殊字符lol的显示次数相同)。当实际上有6或7个整数时,不会出现相同的错误。你是对的。逐步调试表明,在8.4的情况下,它以8作为输入,在执行循环后,“PlayerChoice”的值更改为4,并以4作为新值执行循环。在有几个“char”的情况下characters-它将值分配给0,然后执行循环的次数与有字符的次数相同