1

ユーザーが値 1 または 2 のいずれかの入力を選択できるようにするこのコードを作成しました。

ユーザーが「1asdaosd」のようなものを入力すると、入力は 1 としてのみ認識されます。

isdigit 関数を使用してみましたが、まだうまくいきませんでした。

bool validInput;
    do
    {
        cout << "Choose the game type: ";
        cin >> gametype;
        validInput = true;
        if (cin.fail())
        {
            validInput = false;
            cin.clear();
            cin.ignore(std::numeric_limits<int>::max(), '\n');
        }
        if (gametype<1 || gametype>2) {
            validInput = false;
        }
    } while (!validInput);

予想される動作は次のとおりです。

「1」または「2」以外は有効な入力と見なされないため、サイクルが繰り返されます。「1asdasd」または「2aods」は有効な入力と見なされますが、失敗させたいのです。

4

6 に答える 6

3

以下は、Stroustrup のProgramming: Principles and Practice Using C++の初期の章の 1 つで読んだ内容に基づく方法と、cplusplus.com で Duoas によって提供された回答です。get_int_between()次のようなことを可能にする関数 を定義します。

int my_variable;
get_int_between(my_variable, min, max, prompt, error_msg);

これにより、プロンプトが表示され、検証され、my_variable に保存されます。

楽しみのためにget_int(my_variable, prompt, error_msg)、同じことを行いますが、任意の値の整数を許可する関数 も含めました。

#include <iostream>
#include <sstream> // stringstream

void get_int(int& d, std::string prompt, std::string fail);

void get_int_between(int& d, int min, int max, std::string prompt, std::string fail);

int main()
{
    int my_number = 1; // initialize my_number

    get_int(my_number, "Please enter an integer: ", "Sorry, that's not an integer.\n"); 
    //Do something, e.g. 
    std::cout << "You entered: " << my_number << "\n";

    get_int_between(my_number, 1, 2, "Choose the game type (1 or 2): ", "Sorry, that's not an integer.\n");
    //Do something, e.g.:
    std::cout << "Let's play Game " << my_number << "!\n";

    return 0;
}

void get_int(int& d, std::string prompt, std::string fail)
{
    while(1) {

        std::cout << prompt;
        std::string str;
        std::cin >> str;

        std::istringstream ss(str);
        int val1;
        ss >> val1;

        if(!ss.eof()) {
            std::cout << fail;
            continue;
        } else {
            d = val1;
            break;
        }
    }
}

void get_int_between(int& d, int min, int max, std::string prompt, std::string fail)
{
    while(1) {
        get_int(d, prompt, fail);
        if(d > max || d < min) {
            std::cout << "Sorry, your choice is out of range.\n";
            continue;
        }
        break;
    }
}
于 2014-02-05T14:31:21.513 に答える
1

文字列を使用したい場合はgetlineを使用してください。

#include <iostream>     // std::cin, std::cout
int main () 
{
char name[256], title[256];

std::cout << "Please, enter your name: ";
std::cin.getline (name,256);

std::cout << "Please, enter your favourite movie: ";
std::cin.getline (title,256);

std::cout << name << "'s favourite movie is " << title;

return 0;
}

ゲームタイプをintとして作成すると、1 または 2 しか受け入れられません (もちろん、他の数が受け入れられないようにする必要があります)。

于 2013-03-17T23:18:56.530 に答える
0

各行に 1 つの入力値が必要だと思います。これを文字列として読み取り、要求した以上のものを取得したかどうかを確認する必要があります。整数として必要な場合は、読み取り文字列を後で変換できます。

また、1 桁の整数のみを読み取る必要があると想定しています。桁数が増えると、ループ内で文字列を整数に変換し、さらにチェックする必要があります。

string gametype;
do
{
    cout << "Choose the game type: ";
    // read one word as string, no conversion, so will not fail (may hit eof though)
    cin >> gametype;
    // ignore rest of line (assuming you want next valid input on next line)
    cin.ignore(std::numeric_limits<int>::max(), '\n');
}
while ( gametype.size() != 1 || gametype.at(0) < '1' || gametype.at(0) > '2') );

// char to int conversion (single digit only)
int gametypeint = gametype.at(0) - '0';

// other way to convert string to int
istringstream iss(gametype);
iss >> gametypeint;

// yet another way (C++11)
gametypeint = stio(gametype);
于 2013-03-18T01:03:28.047 に答える
0

は整数であるためgametype、整数に有効な範囲で読み取ろうとしています。1asdaosdは有効な整数ではないため、 で停止します1。そのことを完全に読みたい場合はgametype、たとえば文字列を作成する必要がありますが、それを整数と比較することはできません。

必要に応じて文字列として読み取ることができます。文字列と整数の両方のケースを処理したい場合はstoi、文字列を整数に変換しようとするようなものを使用できます。次に、例外をキャッチして、文字列を整数に変換できるstd::invalid_argumentかどうかを確認します。できない場合は、文字列として保持することを知っています。

于 2013-03-17T23:12:17.180 に答える
0

入力がそのように解釈できる限り、int を読み取ります。その後停止します。文字列変数を読み取ると、すべて取得されます。

于 2013-03-17T23:13:04.340 に答える
0
  1. データを文字列変数に読み込みます。
  2. データが有効な整数であることを確認してください。
  3. 文字列を整数に変換します。

面倒だけどこれしか方法がない

于 2013-03-17T23:16:01.160 に答える