1

[0,2] の範囲の整数を入力するようユーザーに求めるプログラムがあります。次のリンクをガイドとして使用しました。

cin を使用した適切な入力検証ループ - C++

ただし、ユーザーがデータを入力せずにEnterキーを押すと、カーソルはコマンドプロンプトの次の行に移動するだけですが、ユーザーに有効な数値を入力するよう促したいです。この場合、ユーザーにプロンプ​​トを表示することは理にかなっていますか、それとも最初から単一行入力として検証を実装しない理由はありますか? 文字列の場合、これを解決するために getline を使用しますが、この場合はそれを使用する必要がありますか? 上記のリンクに基づく私のコードは次のとおりです。

#include <iostream>

int main()
{
    int answeredNumber;
    while(1)
    {
        std::cout << "Enter your answer: ";
        if(std::cin >> answeredNumber && answeredNumber >= 0 && answeredNumber <= 2)
        {
            break;
        }
        else
        {
            std::cout << "Please enter a valid answer: " ;
            std::cin.clear();
          std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
    }
    system("pause");
}
4

2 に答える 2

3

これは、整数を取得すると、改行を含むcin先頭の空白がスキップされるためです。それを回避する簡単な方法はありません。

行ベースの入力が必要な場合は、入力値を文字列として取得し、それを解釈できます。

#include <iostream>
#include <sstream>
#include <string>

int main (void) {
    std::string inputLine;
    int answer;
    std::cout << "Enter your answer: ";
    while(1) {
        getline (std::cin, inputLine);
        std::stringstream ss (inputLine);
        if ((ss >> answer))
            if ((answer >= 0) && (answer <= 2))
                break;
        std::cout << "No, please enter a VALID answer: " ;
    }
    std::cout << "You entered " << answer << '\n';
    return 0;
}
于 2012-05-22T04:49:31.970 に答える
1

他の答えは問題を特定します。ただし、コードを少し変更すると、差し迫った問題が解決すると思います。

int answeredNumber = std::cin.get() - '0';
if(answeredNumber >= 0 && answeredNumber <= 2)

std::cin>> 演算子を使用してフォーマットされたデータを受け取る場合get()は、 およびその他の関数を使用して、フォーマットされていないデータを受け取る必要があります。

于 2012-05-22T04:57:10.923 に答える