Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 执行while循环时会出现一些非常奇怪的错误_C++_Validation_Debugging_While Loop_Switch Statement - Fatal编程技术网

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次
下面是出现问题的代码片段。案例1到案例3尚未完成,因此目前它们是空白的

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,然后执行循环的次数与有字符的次数相同