1

ゲームで入力検証を機能させるのに苦労しています。

#include <iostream>
#include <ctime>
using namespace std;

int main()
{

    int iGumballs;
    int iUserguess;
    int iGuesses = 0;

    while (true)
    {
        system("CLS");
        cin.clear();
        iGuesses = 0;

    srand(static_cast<unsigned int>(time(0)));
    iGumballs = rand()%1000+1;
    cout << "How many gumballs are in the bumball jar? You guess! 1-1000" << endl;

    do
    {
        cout << "Enter your guess: ";


    cin >> iUserguess;


    if(iUserguess > iGumballs)
    {
        cout << "Too high!" << endl << endl;
    }

    if(iUserguess < iGumballs)
    {
        cout << "Too low!" << endl << endl;
    }
    iGuesses ++;
    }
    while(iUserguess > iGumballs || iUserguess < iGumballs);
    cout << "You guessed the right amout of gumballs" << endl << endl;
    cout << "You took " << iGuesses << " guesses" << endl << endl;
    system ("pause");
    }
    return 0;
}

私は基本的にプログラムを表示したい

Your Guess: Sorry, incorrect input - try again

ユーザーが 1 未満で 1000 を超える数値を入力すると、文字や記号の代わりに数値が入力されていることを確認する何らかの検証が行われます。cin.fail() を試しましたが、うまく動作しませんでした。

ありがとう、ジョン

4

3 に答える 3

2

が数値かどうかを確認するためにいくつかのテストが必要になります。これを試してください:

#include <iostream>
#include <string>
#include <ctime>
#include <boost/lexical_cast.hpp> //dependency that can be optional
using namespace std;

bool is_number(const std::string& s)
{
    std::string::const_iterator it = s.begin();
    while (it != s.end() && std::isdigit(*it)) ++it;
    return !s.empty() && it == s.end();
}

int main()
{

    int iGumballs;
    std::string iUserguessStr;
    int iUserguess;
    int iGuesses = 0;

    while (true)
    {
        system("CLS");
        cin.clear();
        iGuesses = 0;

    srand(static_cast<unsigned int>(time(0)));
    iGumballs = rand()%1000+1;
    cout << "How many gumballs are in the bumball jar? You guess! 1-1000" << endl;

    do
    {
        cout << "Enter your guess: ";


    cin >> iUserguessStr;
    if(is_number(iUserguessStr))
        iUserguess = boost::lexical_cast<int>(iUserguessStr); //you can make your own or maybe use lexical cast to transform a string into integer
    else
        continue; //put some fancy message here warning the user


    if(iUserguess > iGumballs)
    {
        cout << "Too high!" << endl << endl;
    }

    if(iUserguess < iGumballs)
    {
        cout << "Too low!" << endl << endl;
    }
    iGuesses ++;
    }
    while(iUserguess > iGumballs || iUserguess < iGumballs);
    cout << "You guessed the right amout of gumballs" << endl << endl;
    cout << "You took " << iGuesses << " guesses" << endl << endl;
    system ("pause");
    }
    return 0;
}

私の答えは、関連する問題に基づいています:文字列がC++で数値であるかどうかを判断するにはどうすればよいですか?

于 2013-01-04T22:44:23.530 に答える
1

文字を検証するには、 try-catch構造を使用できます。

-最初に文字列を読み込んで型キャストを試み、try-catch でエラーを処理します。
- 次に条件を使用して、入力が範囲内にあることを確認します。
-入力が有効でない場合、表示するエラー メッセージを記述できます。

于 2013-01-04T23:10:59.703 に答える
1

入力ストリームの状態を確認するために使用できますif(cin)。 operator>> は渡された入力ストリームを返すため、使用できますif(cin>>iUserguess)

cin が失敗状態にある場合 (ユーザーが数値以外を入力したなどの理由で)、式if(cin>>iUserguess)は false と評価されます。

ユーザーが数字以外を入力した場合は、再度数字を読み取ろうとする前にcin.clear()、ストリーム状態をクリアして入力を破棄するために呼び出す必要があります。cin.ignore()

あなたの例を使用すると、次のように変更できます。

#include <iostream>
#include <ctime>
#include <limits>
using namespace std;

int main()
{

    int iGumballs;
    int iUserguess;
    int iGuesses = 0;

    while (true)
    {
        system("CLS");

        iGuesses = 0;

        srand(static_cast<unsigned int>(time(0)));
        iGumballs = rand()%1000+1;
        cout << "How many gumballs are in the bumball jar? You guess! 1-1000" << endl;

        do
        {
            cout << "Enter your guess: ";
            if(cin >> iUserguess)
            {
                iGuesses ++;
                if(iUserguess > iGumballs)
                {
                    cout << "Too high!" << endl << endl;
                    continue;
                }

                if(iUserguess < iGumballs)
                {
                    cout << "Too low!" << endl << endl;
                    continue;
                }
            }
            else
            {
                cout<<"incorrect input - try again\n\n";
                cin.clear();
                cin.ignore(numeric_limits<streamsize>::max(),'\n');
                continue;
            }
        }
        while(iUserguess > iGumballs || iUserguess < iGumballs);
        cout << "You guessed the right amout of gumballs" << endl << endl;
        cout << "You took " << iGuesses << " guesses" << endl << endl;
        system ("pause");
    }
    return 0;
}
于 2013-01-04T23:03:39.453 に答える