Cin让我进入两次

时间:2015-12-04 15:50:24

标签: validation c++11 input

我有以下代码来捕获用户。问题是当用户输入字符或字符串触发while时,它会使用户在接受数据之前输入两次数据。我不太确定为什么会这样做,并希望有人可以向我解释。谢谢!

    bool valid_entry = false;
while (!valid_entry) {
    cin >> distanceTraveled;
    while ((!(cin >> distanceTraveled)) ||(distanceTraveled==0)) {
        cin.clear();
        cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
        cout << "ERROR:  invalid Entry.   Try again.\n\nHow far did ya go? ";
        cin.clear();
        cin >> distanceTraveled;
    }

        valid_entry = true;

}

2 个答案:

答案 0 :(得分:0)

这是因为你问他们两次!

cin >> distanceTraveled;
while ((!(cin >> distanceTraveled)) ...

尝试:

// assuming that distanceTraveled == 0 is invalid input
while ((cin >> distanceTraveled) && (distanceTraveled == 0))

如果您尝试清除他们在一行中输入的任何其他输入,则可以改为使用getline

std::string junk;
std::getline(cin, junk);
std::cout << "ERROR:  invalid Entry.   Try again.\n\nHow far did ya go? ";

所以代码现在看起来像这样:

std::string junk;
std::cout << "How far did you go? ";
while ((cin >> distanceTraveled) && (distanceTraveled == 0)) 
{
    std::getline(cin, junk);
    std::cout << "ERROR:  invalid Entry.   Try again.\n\nHow far did ya go? ";
}

答案 1 :(得分:0)

我有类似的问题,但我不完全确定你对getlinejunk做了什么?

这是我放的内容,我可以看到为什么它不会做任何事情,除非你在输入一个字符或特殊字符之后输入两次但是我怎么做它所以它只在有效输入上继续?

我的目标是在输入字母,特殊字符,双精度(小数)或任何内容时使控制台写入无效条目,并且只在有效输入时继续。

我尝试使用if ((programSelect > 0) && (programSelect <=4)),但如果用户输入4.5则会运行程序4,然后说无效条目:/

    do
    {
        cout << "Please select a program to run: ";
        cin >> programSelect;
        if (cin >> programSelect)
        {
            invalid = false;
            break;
        }
        else if (cin.bad())
        {
            cin.clear();
            cin.ignore(INT_MAX, '\n');
            invalid = true;
            cout << "Invalid entry.\n";
        }
        else if (cin.eof())
        {
            cin.clear();
            cin.ignore(INT_MAX, '\n');
            invalid = true;
            cout << "Invalid entry.\n";
        }
        else
        {
            cin.clear();
            cin.ignore(INT_MAX, '\n');
            invalid = true;
            cout << "Invalid entry.\n";
        }
    } while (invalid == true);
    switch (programSelect)
    {
    case 1:
        addItems();
        repeat = true;
        break;
    case 2:
        bodyReview();
        repeat = true;
        break;
    case 3:
        reviewAll();
        repeat = true;
        break;
    case 4:
        repeat = false;
        break;
    default:
        repeat = true;
        break;
    }

所以我找到了一种让这个问题非常好的方法。它限制用户输入字符,特殊字符或小数。如果你能想到一种更有效的方法来完成同样的任务让我知道,这比我想要的更多的线和变量,但完成了所需的任务。

    double userInput, inDec;
    int programSelect, decTest;
    bool invalid(true);
    do
    {
        cout << "Please select a program to run: ";
        cin >> userInput;
        decTest = userInput;
        inDec = userInput - decTest;
        programSelect = userInput - inDec;
        if ((inDec > 0) || (inDec < 0))
        {
            cin.clear();
            cin.ignore(INT_MAX, '\n');
            invalid = true;
            cout << "Invalid entry.\n";
        }
        else if (!cin)
        {
            cin.clear();
            cin.ignore(INT_MAX, '\n');
            invalid = true;
            cout << "Invalid entry.\n";
        }
        else if ((programSelect > 0) && (programSelect <= 4))
        {
            invalid = false;
            break;
        }
        else
        {
            cin.clear();
            cin.ignore(INT_MAX, '\n');
            invalid = true;
            cout << "Invalid entry.\n";
        }
    } while (invalid == true);

这为用户输入使用double来检测他们是否输入了小数,如果他们这样做则返回Invalid entry error,如果用户输入了一个字符或特殊字符,也会避免无限cout循环。