2016-10-13 9 views
0
while(cout << "Enter a positive integer: " && 
     (!(cin >> anInteger) || anInteger < 0)) 
{ 
    cout << "Enter a positive integer.\n"; 
    cin.clear(); 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
} 

while(cout << "Read or write (r/w): " && 
     (!(cin >> rw) || (rw != 'r' && rw != 'w'))) 
{ 
    cout << "Enter r or w.\n"; 
    cin.clear(); 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
} 

ここでは、整数を求め、次に「r」または「w」を求めます。しかし、最初のwhile文に '4r'のようなものを入力すると、 'r'はバッファに残り、次のwhile文に適用されます。これをどうすれば解決できますか?シンバッファーは無視されませんか?

文字を切り捨てるのではなく最初のwhileループにすべての整数がある場合、入力を受け入れる最も簡単な方法は何ですか?

+0

すべてのデータを 'std :: string'として読み込み、それを解析して正しい入力があるかどうかを判断することをお勧めします。 – NathanOliver

+0

'4r'と入力すると、' cin >> anInteger'は失敗しません。整数 '4'を読み込み、' r'文字に 'cin'を置きます。ループの後にも 'cin.ignore()'を呼び出すべきです。 – Barmar

答えて

1

整数の後の行にあるものはignore()です。整数を読み込むと、整数に当てはまらない最初の文字で読み込みが停止します。つまり、次の改行は読み込まれません。あなたが複数の場所で行の最後までの文字を無視している、そうするようにマニピュレータを作成して使用するのが妥当かもしれ考慮

:ループは常に行の残りの部分を無視すること

std::istream& igln(std::istream& in) { 
    return in.ignore(std::numeric_limits<std::streamsize>::max()); 
} 
... 
while (std::cout << "Read or write (r/w): " 
    && (!(std::cin>> igln >> rw) || (rw != 'r' && rw != 'w')) { 
    std::cout << "Enter r or w!\n"; 
    if (std::cin.eof()) { 
     throw std::runtime_error("reached end of stream\n"); 
    } 
    std::cin.clear(); 
} 

注意としたがって、ループ内では必要ありません。

関連する問題