简体   繁体   English

初学者 C++ 使用 cin.fail() 防止无效输入

[英]Beginner C++ Protecting against invalid input with cin.fail()

I just finished working on this marble game program and it works fine except I need to do one more thing to protect it from invalid input.我刚刚完成了这个大理石游戏程序的工作,它运行良好,但我需要再做一件事来保护它免受无效输入的影响。 The program responds properly to all integer based invalid input but if you input a non integer the program crashes.该程序正确响应所有基于整数的无效输入,但如果您输入非整数,程序将崩溃。 I've been using the cin.fail() function and it works but then gets stuck in a loop.我一直在使用 cin.fail() 函数,它可以工作,但随后陷入循环。 If the user enters a non integer i want the program to tell the user that was invalid input and prompt the user to input their selection again.如果用户输入一个非整数,我希望程序告诉用户输入无效并提示用户再次输入他们的选择。

I added return 1;我加了 return 1; after the invalid input statement to end the program instead of it crashing but that's not what I want to do.在无效输入语句之后结束程序而不是崩溃,但这不是我想要做的。 I want it to print "invalid input" and then re-prompt the user to input their selection again.我希望它打印“无效输入”,然后重新提示用户再次输入他们的选择。

#include <iostream>
using namespace std;

int main()
{
    cout << "*** The Game of Nim ***\n\n" << endl;

    string player1, player2, currentPlayer;
    int marbles, selection;
    bool isDone = false;

    cout << "Enter a name for Player 1: ";
    cin >> player1;
    cout << "Enter a name for Player 2: ";
    cin >> player2;
    cout << "Enter how many marbles you would like to start with in the pile: ";
    cin >> marbles;

    cout << "\nThere are " << marbles << " marbles in the pile\n" << endl;

    currentPlayer = player1;

    do
    {
        bool turnDone = false;

        while (turnDone == false && marbles != 0)
        {
            if (currentPlayer == player1)
            {
                cout << currentPlayer << "\n";

                cout << "How many marbles would you like to draw? : ";
                cin >> selection;

                if (cin.fail())
                {
                    cout << "\nInvalid Input\n";
                    return 1;

                }


                if (selection < marbles / 2 + 1 && marbles > 1 && selection != 0)
                {
                    marbles = marbles - selection;

                    if (marbles == 1)
                    {
                        cout << "\nUh Oh! There is only 1 marble remaining in the pile\n" << endl;

                        currentPlayer = player2;
                        turnDone = true;
                        break;
                    }

                    cout << "\nThere are " << marbles << " marbles remaining in the pile\n" << endl;

                    currentPlayer = player2;

                    turnDone = true;

                }else if (marbles == 1)
                {
                    marbles = marbles - selection;

                    if (marbles <= 0)
                    {
                        cout << "\nThere are 0 marbles remianing in the pile\n";

                        cout << "You drew the last marble!" << endl;
                        cout << "You lose!\n\n" << endl;
                        cout << player2 << " wins\n\n" << endl;

                        turnDone = true;

                        return 0;

                    }

                }else if (selection == 0 || selection > marbles / 2 + 1)
                {
                    cout << "\nYou must draw at least 1 marble, and no more than half the pile\n" << endl;
                }

            }else if (currentPlayer == player2)
            {
                cout << currentPlayer << "\n";

                cout << "How many marbles would you like to draw? : ";
                cin >> selection;

                if (selection < marbles / 2 +1 && marbles > 1 && selection != 0)
                {
                    marbles = marbles - selection;

                    if (marbles == 1)
                    {
                        cout << "\nUh Oh! There is only 1 marble remaining in the pile\n" << endl;

                        currentPlayer = player1;
                        turnDone = true;
                        break;
                    }

                    cout << "\nThere are " << marbles << " marbles remaining in the pile\n" << endl;

                    currentPlayer = player1;

                    turnDone = true;

                }else if (marbles == 1)
                {
                    marbles = marbles - selection;

                    if (marbles <= 0)
                    {
                        cout << "\nThere are 0 marbles remianing in the pile\n";

                        cout << "You drew the last marble!" << endl;
                        cout << "You lose!\n\n" << endl;
                        cout << player1 << " wins!\n\n" << endl;

                        turnDone = true;

                        return 0;

                    }

                }else if (selection == 0 || selection > marbles / 2 + 1)
                {
                    cout << "\nYou must draw at least 1 marble, and no more than half the pile\n" << endl;
                }
            }
        }
    }while (isDone == false);

    return 0;
}

Here's how to use std::cin.fail() in your program:以下是在程序中使用 std::cin.fail() 的方法:

int marbles;
bool check = false;
do {
    std::cout << "Enter how many marbles you would like to start with in the pile: ";
    std::cin >> marbles;
    if (std::cin.fail()) {
        std::cin.clear();
        std::cin.ignore();
    }
    else
        check = true;
}while(!check);

cin.fail() will return a boolean saying wether or not the expected income as been received cin.fail() 将返回一个布尔值,说明是否收到了预期的收入
If not, you'll have to use clear() wich will put the fail value to false and then ignore the given input如果没有,您将必须使用 clear() 将失败值设置为 false 然后忽略给定的输入
Hope that helped希望有所帮助

Get the user input in a string and check if there's any number in it:获取用户输入的字符串并检查其中是否有任何数字:

std::string input; 
std::cin >> input;
int marbles = std::atoi(input.c_str()); //Returns the first number met in the char table, if there is none, returns 0

if(marbles)
    std::cout << marbles;

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

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