Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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++中输入无效的提示_C++_Loops - Fatal编程技术网

C++中输入无效的提示

C++中输入无效的提示,c++,loops,C++,Loops,我知道这可能是一个相当基本的问题,但我被难住了。我试图提示用户输入1、2、3或4。如果他们没有输入有效的选项,请再次询问他们。但每当我执行程序并输入无效结果时,它都会循环,不停地进行用户输入,一遍又一遍地打印第一行。我怎样才能解决这个问题?从函数本身调用函数是个坏主意吗?我需要清除cin吗 int hallwayask() { int input; cout << "1: Door 1 \n2: Door 2 \n3: Door 3 \n4: Door 4\n";

我知道这可能是一个相当基本的问题,但我被难住了。我试图提示用户输入1、2、3或4。如果他们没有输入有效的选项,请再次询问他们。但每当我执行程序并输入无效结果时,它都会循环,不停地进行用户输入,一遍又一遍地打印第一行。我怎样才能解决这个问题?从函数本身调用函数是个坏主意吗?我需要清除cin吗

int hallwayask()
{
    int input;
    cout << "1: Door 1 \n2: Door 2 \n3: Door 3 \n4: Door 4\n";
    cin >> input;
    if (cin.good())
    {
        switch(input)
        {
            case 1:
                room1();
                break;
            case 2:
                room2();
                break;
            case 3:
                room3();
                break;
            case 4:
                room4();
                break;
            default:
                cout << "Please enter a valid number." << endl;
                break;
        }
    }
    else
    {
        hallwayask();
    }
}

试试这个片段。这是不言自明的,而且您不必一次又一次地调用该函数,从而使逻辑更简单,程序更快

内走廊 { int输入; //如果你愿意的话,在这里写下do{ //选择时要反复显示的选项 //用户提供的输入无效 cout>输入; 开关输入 { 案例1: 房间1; 打破 案例2: 2号房间; 打破 案例3: 3号房间; 打破 案例4: 4号房间; 打破 违约:
cout试试这个代码段。它是不言自明的,而且你不必一次又一次地调用这个函数,这样逻辑更简单,程序更快

内走廊 { int输入; //如果你愿意的话,在这里写下do{ //选择时要反复显示的选项 //用户提供的输入无效 cout>输入; 开关输入 { 案例1: 房间1; 打破 案例2: 房间2; 打破 案例3: 3号房间; 打破 案例4: 4号房间; 打破 违约: 试试这个:

#include <iostream>
using namespace std;
int hallwayask();

int main()
{
    hallwayask();

}

int hallwayask()
{
    int input;
    bool flag = true;
    while (flag)
    {
        cout << "1: Door 1 \n2: Door 2 \n3: Door 3 \n4: Door 4\n";
        cin >> input;
        if (cin.good())
        {
            switch(input)
            {
                case 1:
                    cout << room1();
                    flag = false;
                    break;
                case 2:
                    cout << room2();
                    flag = false;
                    break;
                case 3:
                    cout << room3();
                    flag = false;
                    break;
                case 4:
                    cout << room4();
                    flag = false;
                    break;
                default:
                    cout << "Please enter a valid number." << endl;
                    break;
            }
        }
        else
        {
            cout << "Invalid input, enter an int" << endl;
            cin.clear();
            cin.ignore(INT8_MAX, '\n');
        }
    }
}
我将bool标志设置为true,虽然这是true,但它将永远持续,但一旦用户输入正确的数字1-2-3-4,我将标志设置为false,因此它将停止

这样想:如果为true,则执行这段代码,如果为false,则停止。 如果是真的,那么while将永远持续下去,但是一旦我输入1-2-3-4,我就停止while循环

我确信还有其他方法可以做到这一点;我总是依赖于标志true/false来实现这一点,但还有其他可用的选项。

尝试以下方法:

#include <iostream>
using namespace std;
int hallwayask();

int main()
{
    hallwayask();

}

int hallwayask()
{
    int input;
    bool flag = true;
    while (flag)
    {
        cout << "1: Door 1 \n2: Door 2 \n3: Door 3 \n4: Door 4\n";
        cin >> input;
        if (cin.good())
        {
            switch(input)
            {
                case 1:
                    cout << room1();
                    flag = false;
                    break;
                case 2:
                    cout << room2();
                    flag = false;
                    break;
                case 3:
                    cout << room3();
                    flag = false;
                    break;
                case 4:
                    cout << room4();
                    flag = false;
                    break;
                default:
                    cout << "Please enter a valid number." << endl;
                    break;
            }
        }
        else
        {
            cout << "Invalid input, enter an int" << endl;
            cin.clear();
            cin.ignore(INT8_MAX, '\n');
        }
    }
}
我将bool标志设置为true,虽然这是true,但它将永远持续,但一旦用户输入正确的数字1-2-3-4,我将标志设置为false,因此它将停止

这样想:如果为true,则执行这段代码,如果为false,则停止。 如果是真的,那么while将永远持续下去,但是一旦我输入1-2-3-4,我就停止while循环

我确信还有其他方法可以做到这一点;我一直依赖于标志true/false,但还有其他可用的选项。

问题是,一旦cin失败,您无法清除流的错误状态,因此操作符>>不断失败,而good不断返回false,因此您陷入了一个无休止的循环中

您需要在使用用户输入之前使其有效,并在输入无效时清除该输入,这样您就不会继续重新读取它

此外,您应该使用迭代循环而不是递归循环

请尝试以下方法:

包括 内走廊 { int输入; cout>输入 { 问题是,一旦cin失败,您就无法清除流的错误状态,因此操作符>>不断失败,而good不断返回false,因此您陷入了一个无休止的循环中

您需要在使用用户输入之前使其有效,并在输入无效时清除该输入,这样您就不会继续重新读取它

此外,您应该使用迭代循环而不是递归循环

请尝试以下方法:

包括 内走廊 { int输入; cout>输入 {
CUT不相关:HalayAdvices承诺返回一个INT,但不可以。这会导致一个错误的程序。考虑在这里使用一个循环,而不是递归。也可以把这个放在这里:总是更容易和正确的方式来做这个任务是1读取输入作为一个字符串,2检查字符串是否匹配期望3将字符串转换为一个字符串。这是一个可行的方法。作为一个例子,为什么你的方法不起作用,尝试输入4B,这将被读取为整数4,它将通过所有的测试。但是它不是正确的输入。无关的:HalpAdvices承诺返回INT但不。这可能导致一个错误的程序。侧记:考虑在这里使用循环而不是重新使用。cursion.也可以将其放在此处:。执行此任务的最简单和正确的方法始终是:1将输入读取为字符串,2检查字符串是否符合预期3将字符串转换为整数。这是一种有效的方法。作为一个说明方法不起作用的示例,请尝试输入4b,它将被读取为整数4,并将其转换为整数我会通过你们所有的测试。但这不是正确的输入。用递归实现阶乘也会使用m
这是一个非常慢的空间。将其编写为循环要简单得多,效率也要高得多。递归可以是分析算法和考虑可计算性的强大工具,但在实际代码中非常罕见。几乎总有更好的方法可以做到这一点。用递归实现阶乘递归占用了太多的空间,而且速度非常慢。将其编写为循环要简单得多,效率也要高得多。递归可以是分析算法和考虑可计算性的强大工具,但在实际代码中非常罕见。几乎总是有更好的方法去做。