繁体   English   中英

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

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

我刚刚完成了这个大理石游戏程序的工作,它运行良好,但我需要再做一件事来保护它免受无效输入的影响。 该程序正确响应所有基于整数的无效输入,但如果您输入非整数,程序将崩溃。 我一直在使用 cin.fail() 函数,它可以工作,但随后陷入循环。 如果用户输入一个非整数,我希望程序告诉用户输入无效并提示用户再次输入他们的选择。

我加了 return 1; 在无效输入语句之后结束程序而不是崩溃,但这不是我想要做的。 我希望它打印“无效输入”,然后重新提示用户再次输入他们的选择。

#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;
}

以下是在程序中使用 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() 将返回一个布尔值,说明是否收到了预期的收入
如果没有,您将必须使用 clear() 将失败值设置为 false 然后忽略给定的输入
希望有所帮助

获取用户输入的字符串并检查其中是否有任何数字:

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