2009-08-23 1 views
0

申し訳ありませんが、ここではnoobish質問ですが、私はC++を学んでいます。この問題を扱う標準的な方法を探しています。私はVS2005を使用しています。あなたがプログラムは、あなたが再び何も入力できるようにすることは決してありません整数以外のものを入力した場合入力ストリームに残っている余分な文字に対処するにはどうすればよいですか?

#include <iostream> 

using namespace std; 

int main() 
{ 
    while (true) 
    {  
     cout << "enter anything but an integer and watch me loop." << endl;  
     int i; 
     cin >> i;    
    } 
    return 0; 
} 

は、プログラムを考えます。さて、これは、フォーマットが失敗した後にストリームに入力が残っていることに気づきました。したがって、それぞれの呼び出しは< <です。次の終了行まで読み込んでいます(私は思う)。どうやってストリームをクリアしたり、この問題に取り組んでいますか?それはかなり一般的でなければならない。

答えて

2

申し訳ありませんが、私は答えを見つけました。答えは...

これをしないでください。フォーマットされた入力と書式なしの入力を演算子>>を使用して混在させないでください。ここでは、件名に良い記事です:

http://www.cplusplus.com/forum/articles/6046/

基本的にコードの変更:

#include <iostream> 
#include <string> 
#include <stream> 

using namespace std; 

int main() 
{ 
    while (true) 
    {   
     cout << "enter anything but an integer and watch me loop." << endl;  
     string input; 
     getline(cin, input); 
     int i; 
     stringstream stream(input); 
     if (stream >> i) break;      
    } 
    return 0; 
} 
+0

あなたは本当に私を文字列にして変換することができました。 – NomeN

+0

ええ、私は、C++の不正な入力を防ぐ標準的な方法を探していました。これはそうだ。 –

+0

先に進み、答えを受け入れてください!とdownvotesを削除し、答えは実際には間違っていない(もう;-))。しかし、このコードは醜いですが、より良く、より専門的に機能します。良い発見! – NomeN

0

cin.ignore(int num_bytes_to_ignore);それを行います。

また、stdio、fflush(fd)を使用することもできます。ここで、fdはstdout、stderr、stdinのいずれかです。

+0

は、私が「フラッシュ」メンバ関数を参照してください、とCINの前に無視する呼び出しはありません> >私は問題を解決しません。 –

+0

私はignore()を間違って使用しているかもしれません。 –

+0

申し訳ありませんが、cin.flushは実際には存在しません.fflush(stdin)は必要なものです。 – tim

2

ifコールでcinコールを囲みます。

誤ったデータを読み込むと、cinはfalseを返します。そう

if (!cin >> i) { 
    cin.clear(); 
    cin.ignore(INT_MAX, '\n'); 
    cout << "Haha, your looping efforts have been thwarted dear sir\n"; 
} 

cin.flushは、()ではなく、明らかVS上(cppreference.comに応じて)トリックを行う必要があります。

cin.clear()は、すべてのフラグを正常な状態にリセットします。 cin.ignoreが大きい番号で、 '\ n'が機能するまで。

+0

ストリームを返します。このストリームは、trueまたはfalseに変換できるvoid *に変換できますが、それでも対処方法を尋ねなければなりません。確かに、私は悪い入力を検出することができますが、それでは何ですか?それは、私はVS2005 –

+0

フラッシュはのIStreamのメンバ関数ではありませんストリームに残っている私はのiostreamを使用していますが、CINはそれがない...うんはistream –

+0

... –

関連する問題