繁体   English   中英

如何在 C++ 中检查有效的用户输入

[英]How to check for a valid user input in C++

我正在尝试用 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;
}

但是当我运行并输入一些无效的东西时,我得到的是一个持续运行的安慰 .

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

因此,如果用户输入任何整数类型不接受的值,它就会使您的应用程序崩溃,从而生成此无限循环。

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

cin >> guess;

通过受保护的人:

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

进入上面可以看到“numeric_limits ::最大()”,这是解释在这里

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

最后,用户输入低于 1000(根据要求)或不是有效整数时,您有一段时间将用户置于此阅读循环中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM