web-dev-qa-db-ja.com

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

私は2番目のOOP=クラスにいて、最初のクラスはC#で教えられたので、C++は初めてで、現在はcinを使用して入力検証を練習しています。したがって、私の質問は次のとおりです。

このループは、入力を検証するためのかなり良い方法を構築しましたか?それとも、より一般的で受け入れられた方法がありますか?

ありがとう!

コード:

int taxableIncome;
int error;

// input validation loop
do
{
    error = 0;
    cout << "Please enter in your taxable income: ";
    cin >> taxableIncome;
    if (cin.fail())
    {
        cout << "Please enter a valid integer" << endl;
        error = 1;
        cin.clear();
        cin.ignore(80, '\n');
    }
}while(error == 1);
17
Alex

私はiostreamの例外を有効にするのはあまり好きではありません。 I/Oエラーは、エラーが発生する可能性が非常に高いという点で、例外的ではありません。エラーの頻度が少ない場合は、例外のみを使用することを好みます。

コードは悪くありませんが、80文字をスキップすることは少し恣意的であり、ループをいじる場合はエラー変数は必要ありません(ループを維持する場合はboolにする必要があります)。 cinからの読み取りを直接ifに入れることができます。これはおそらくPerlのイディオムに近いものです。

これが私の見解です:

int taxableIncome;

for (;;) {
    cout << "Please enter in your taxable income: ";
    if (cin >> taxableIncome) {
        break;
    } else {
        cout << "Please enter a valid integer" << endl;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
}

80文字だけをスキップすることを除いて、これらはほんの小さな問題であり、優先スタイルの問題です。

30
P-Nuts
int taxableIncome;
string strInput = "";
cout << "Please enter in your taxable income:\n";

while (true) 
{
    getline(cin, strInput);

    // This code converts from string to number safely.
    stringstream myStream(strInput);
    if ( (myStream >> taxableIncome) )
        break;
    cout << "Invalid input, please try again" << endl;
}

つまり、入力に文字列を使用し、それを整数に変換します。この方法では、誰かがエンター、「ミッキーマウス」などと入力しても、応答します。
また、#include <string>および<sstream>

5
ari-free

例外処理の概念に慣れるために、try/catchを検討する必要はありませんか?

そうでない場合は、なぜ0と1ではなくブール値を使用しないのですか?正しいタイプの変数を使用する(そして必要に応じてタイプを作成する)習慣を身に付ける

Cin.fail()は http://www.cplusplus.com/forum/beginner/2957/ でも説明されています

実際、多くの場所で...

http://www.google.com.sg/#hl=en&source=hp&q=c%2B%2B+tutorial&btnG=Google+Search&meta=&aq=f&oq=c%2B%2B+tutorial

あなたはそれらのいくつかを研究し、物事が特定の方法で行われなければならない理由の説明に従うよう試みるかもしれません。

しかし、遅かれ早かれ、例外を理解する必要があります...

1つの小さな問題は、エラーヘルパー変数が完全に冗長であり、必要ないことです。

do
{
    cin.clear();
    cout << "Please enter in your taxable income: ";
    cin >> taxableIncome;
    if (cin.fail())
    {
        cout << "Please enter a valid integer" << endl;
        cin.ignore(80, '\n');
    }
}while(cin.fail());
2