2013-06-05 22 views
5

入力を求めるプロンプトを表示し、検証を実行しようとしました。たとえば、私のプログラムは3人のユーザー入力を取る必要があります。非整数になると、エラーメッセージが表示され、入力を再度促します。ここになるだろう私のプログラムを実行するときにどのように見えるかです:入力の整数検証

間違っB:1

番号を入力してください。

番号が入力

間違った入力:

は、番号を入力します。入力

数字を入力:2

は、番号を入力します。

double read_input() 
{ 
    double input; 
    bool valid = true; 
    cout << "Enter number: " ; 
    while(valid){ 
     cin >> input; 
     if(cin.fail()) 
     { 
      valid = false; 
     } 
    } 
    return input; 
} 

私の主な方法:

int main() 
{ 
double x = read_input(); 
double y = read_input(); 
double z = read_input(); 
} 

私の3つの

数字入力するには、1,2,3

そしてここでは私のコードであります最初の入力は整数ではなく、プログラムはそれだけで終了します。それは再び催促を求めることはありません。どうすれば修正できますか?または、私はユーザーの入力を求めているので、do whileループを使用するはずです。

ありがとうございます。読み取りに失敗した

+0

私たちはもっとコードを見なければなりません。あなたはデバッガでそれをチェックしましたか?クラッシュする可能性があります... –

+0

メインメソッドの内側に私はちょうどダブルx = read_input()を書く; double y = read_input(); double z = read_input();私は間違ったやり方をしていますか? –

答えて

7

、あなたはfalsevalidを設定し、そのwhileループの条件がfalseであり、プログラムが(ちなみに、初期化されません)inputを返します。

あなたはまたのようなもの、それを再度使用する前に、バッファを空にすることがあります。

#include <iostream> 
#include <limits> 

using namespace std; 

double read_input() 
{ 
    double input = -1; 
    bool valid= false; 
    do 
    { 
     cout << "Enter a number: " << flush; 
     cin >> input; 
     if (cin.good()) 
     { 
      //everything went well, we'll get out of the loop and return the value 
      valid = true; 
     } 
     else 
     { 
      //something went wrong, we reset the buffer's state to good 
      cin.clear(); 
      //and empty it 
      cin.ignore(numeric_limits<streamsize>::max(),'\n'); 
      cout << "Invalid input; please re-enter." << endl; 
     } 
    } while (!valid); 

    return (input); 
} 
+0

私はelse文でcoutを入れて、整数でないと入力したとき、エラーメッセージ自体は繰り返しループし続けます。 –

+0

私はコードをテストすることはできませんが、Ideoneは同じ出力を持っています。理由を調べてみましょう。 – Djon

+0

@Carolそれは今、 'clear'と' ignore'の間の順序だったと思います:http://ideone.com/fl4IMK – Djon

0

あなたの質問が失敗(上CINをクリアするなどの他の問題に自分自身を手に入れた) -

double read_input() 
{ 
double input; 
int count = 0; 
bool valid = true; 
while(count != 3) { 
    cout << "Enter number: " ; 
    //cin.ignore(); 
    cin >> input; 
    if(cin.fail()) 
    { 
     cout << "Wrong Input" <<endl; 
     cin.clear(); 
     cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 
    else 
      count++; 
} 
return input; 
} 
0
あなたが非有効な入力、この腹筋を得るまで

問題は、while条件

bool valid = true; 
while(valid){ 

あなたループ内にありあなたは何をしたいのですか?ループ条件は、ここでは、この

bool valid = false; 
while(! valid){ // repeat as long as the input is not valid 

ようにする必要があり、あなたのread_double

double read_input() 
{ 
    double input; 
    bool valid = false; 
    while(! valid){ // repeat as long as the input is not valid 
     cout << "Enter number: " ; 
     cin >> input; 
     if(cin.fail()) 
     { 
      cout << "Wrong input" << endl; 

      // clear error flags 
      cin.clear(); 
      // Wrong input remains on the stream, so you need to get rid of it 
      cin.ignore(INT_MAX, '\n'); 
     } 
     else 
     { 
      valid = true; 
     } 
    } 
    return input; 
} 

の修正版であり、あなたのメインの中であなたが望むようダブルス得るような例

int main() 
{ 
    double d1 = read_input(); 
    double d2 = read_input(); 
    double d3 = read_input(); 

    cout << "Numbers entered are: " << d1 << ", " << d2 << ", " << d3 << endl; 

    return 0; 
} 
のために、のために依頼する必要があります

read_double()を呼び出し、配列に戻り値を保存するループを作成することもできます。

+0

よろしくお願いいたします。私はcin.clear()とgetlineをelse文で使用しています。 –