2009-08-16 12 views
4

私のプログラムの特定の入力領域に問題があります。ユーザーが特定の整数を入力する部分がいくつかあります。たとえそれが間違っていて間違っていても、「m」のような整数型ではないものを入力すると、エラーメッセージが繰り返しループします。ユーザー入力の整数 - エラー処理

私は整数入力を持つ2つの関数を持っています。ここに例を挙げます。 [SOLVED]

void Room::move(vector<Room>& v, int exone, int extwo, int exthree, int current) 
{ 
    v[current].is_occupied = false; 
    int room_choice; 
    cout << "\nEnter room to move to: "; 
    while(true) 
    { 
     cin >> room_choice; 
     if(room_choice == exone || room_choice == extwo || room_choice == exthree) 
     { 
      v[room_choice].is_occupied = true; 
      break; 
     } 
     else cout << "Incorrect entry. Try again: "; 
    } 
} 

void Room::move(vector<Room>& v, int exone, int extwo, int exthree, int current) 
{ 
    v[current].is_occupied = false; 
    int room_choice; 
    cout << "\nEnter room to move to: "; 
    while(true) 
    { 
     cin >> room_choice; 
     if(room_choice == exone || room_choice == extwo || room_choice == exthree) 
     { 
      v[room_choice].is_occupied = true; 
      break; 
     } 
     else if(cin.fail()) 
     { 
      cin.clear() 
      cin.ignore() 
      cout << "Incorrect entry. Try again: "; 
     } 
    } 
} 
+3

Aaarrghを!なぜ教授はこれらの愚かなコンソールI/O演習を割り当て続けますか? –

答えて

6

あなたはCINが正常に提供された入力値を扱うことができるかどうかを判断するためにcin.good()またはcin.fail()を使用することができます。その後、必要に応じてcin.clear()を使用して、処理を続行する前にエラー状態をクリアすることができます。

+0

ええ、実際には、バッファをクリアするためにcin.clear()を使ってみましたが、何も変更されませんでした。私はあなたの他の提案を試みます。 – trikker

+0

cin.fail()をチェックし、cin.ignore()とcin.clear()を使ってパッチを当てました。ありがとう。 – trikker

+0

cin.sync()も役に立ちます。未読の文字をすべて削除します –

9

"解決済み"コードにはまだ問題があります。値をチェックする前にfail()をチェックする必要があります。 (そして明らかに、フォーマットの問題とは対照的に、eof()とIOの問題があります)。

慣用的な読書がさらに簡単な方法については

if (cin >> choice) { 
    // read succeeded 
} else if (cin.bad()) { 
    // IO error 
} else if (cin.eof()) { 
    // EOF reached (perhaps combined with a format problem) 
} else { 
    // format problem 
} 
+1

これは絶対に正しい方法です。 –

+0

しかし何回指摘されても、人々は間違ったやり方を主張している。私はそれをあきらめています:-( –

+0

ありがとうAProgrammer。私はそれにパッチを当てます。 – trikker

1

で、あなたはこのような!演算子を使用することができます

 if (!(cin >> room_choice)) 
     { 
      cin.clear(); 
      cin.ignore(); 
      cout << "Incorrect entry. Try again: "; 
     } 
関連する問題