【问题标题】:How to check for a valid user input in C++如何在 C++ 中检查有效的用户输入
【发布时间】:2018-05-16 14:44:33
【问题描述】:

我正在尝试用 C++ 构建 Bulls & Cows 游戏。我已经实现了大部分逻辑。游戏使用无限循环连续运行,并在每次运行时生成一个随机值。

我现在要做的是接受用户输入并在输入有效的情况下运行代码(只能是 4 位整数)。这是我的实现:

#include ...

using namespace std;

vector<int> getDigits(int modelValue) {
    vector<int> vectorValue;
    int extractedDigit = 0;
    int modulant = 10000;
    int divisor = 1000;

    for (int i = 0; i < 4; i++) {
        extractedDigit = (modelValue % modulant) / divisor;
        vectorValue.push_back(extractedDigit);
        modulant /= 10;
        divisor /= 10;
    }return vectorValue;
}


int main() {
    for (;;) {
        int model = rand() % 9000 + 1000;
        int guess = 0000;
        int bulls = 0;
        int cows = 0;
        int counter = 1;

        cout << "This is the random 4-digit integer: " << model << endl;
        cout << "Enter a value to guess: ";
        cin >> guess;

        if ((guess >= 1000) && (guess <= 9999) && (cin)) {

            vector<int> modelVector = getDigits(model);
            vector<int> guessVector = getDigits(guess);

            for (int i = 0; i < 4; i++) {

                if (find(modelVector.begin(), modelVector.end(), guessVector[i]) != modelVector.end()) {
                    if (modelVector[i] == guessVector[i]) { bulls += 1; }
                    else { cows += 1; }
                }
            }cout << "There are " << bulls << " bulls and " << cows << " cows" << endl;
        }
        else {
            cout << "Please enter a valid 4-digit integer between 0000 and 9999" << endl;
            cin.clear();
        }
    }return 0;
}

但是当我运行并输入无效的内容时,我得到的是一个持续运行的

【问题讨论】:

  • 你不会在任何地方跳出循环......
  • 你能澄清“持续运行的控制台”吗?是至少显示错误消息并要求更多输入,还是只是挂起?您尝试过哪些输入?
  • @LukeRamsden 我想做的是给cout 一个错误信息,以防出现奇怪的输入并重新开始。 @布兰登麦肯齐。控制台只是连续运行。如果你愿意的话,它基本上是“挂起”的。
  • 我刚刚发布了同样问题的答案here(在其他答案被接受或赞成之前,不能将其标记为重复)
  • @OnurOzbek:不错的提议,但我懒得做 :-)

标签: c++


【解决方案1】:

您读取用户输入的方式没有任何问题,它只是在将值分配给您的“猜测”变量之前不检查输入类型。

因此,如果用户输入了整数类型不接受的任何值,则会导致您的应用程序崩溃并生成这个无限循环。

为了保护您的整数变量免受错误的用户输入,您必须替换您的直接输入赋值:

cin >> guess;

受保护者:

while(!(cin >> guess) || (guess < 1000)){
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cout << "Invalid input. Please, try again: ";
}

进入上面的while,你可以看到“numeric_limits::max()”解释here:

返回数字类型 T 可表示的最大有限值。对所有有界类型都有意义。

最后你有一个 while 让用户进入这个阅读循环,而它的输入低于 1000(根据要求)或者不是一个有效的整数。

【讨论】:

  • 能否详细说明numeric_limits&lt;streamsize&gt;::max()
  • 详细说明。代码转储不是答案。
  • @OnurOzbek 请检查答案是否更合适。谢谢
  • @LightnessRacesinOrbit 您的句子中缺少一些神奇的词。感谢您的反馈。
  • @AntonioAlecrimJr:不,什么都没有。
【解决方案2】:

试试cin.ignore()。它将帮助您刷新cin 缓冲区。

【讨论】:

  • 但这不是问题。
  • 嗯,是的。如果有人输入了无法提取到int 的内容,那么该内容不会消失,并且您仍然无法在下一次循环迭代中将其提取到int 中。它仍在缓冲区中,等待您将其提取到兼容的内容中。您需要跳过它,将其从输入缓冲区中删除。这已在 Stack Overflow 上多次介绍过,也应在您的 C++ 书中进行解释。
  • @LightnessRacesinOrbit 他改变了答案。最初他让我切换到一个 while 循环,而这不是我想要的。
  • @OnurOzbek:是的,我现在明白了。好的!
猜你喜欢
  • 2014-08-08
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 2013-01-06
  • 2013-06-08
相关资源
最近更新 更多