2016-07-01 3 views
0

この問題を示す簡単なプログラムです。予想通り数値の後に続く「文字列のような」値が印刷されると無視されるのはなぜですか?

#include <iostream> 

using namespace std; 

double d; 

int main() { 

    cin >> d; 

    if (cin.fail()) { 

     cout << "Input is invalid" << endl; 

    } 

    else { 

     cout << d << endl; 

    } 

    return (0); 

} 

Input is invalidadsfasdf又は[email protected]#$!*@#(&Adfプリントのような値を入力します。 13.52のような数値を入力すると、期待通りに13.52が返されます。

しかし数字で始まり、文字列に続くもの、例えば13.52asdfasdf!#@[email protected]#$!#Aなどを入力すると、13.52が表示されます。だから、なぜそのような入力は印刷されませんInput is invalid

数字部分を印刷するのではなく、この入力を無効として扱うにはどうすればよいですか?

+2

これは 'cin'が動作する方法です。詳細はマニュアルを読んでください。それはあなたが必要としているものを最高のものを読んで、将来の読書のために残そうとします。入力バリデータとしてそのまま使用するようには設計されていません。行全体を文字列として読み込み、自分で検証することができます。 –

+1

いつものように、データを文字列として読み込み、そこから検証します。 – NathanOliver

+0

_ **入力** _の定義は何ですか?すべて連続した文字(スペース区切りではない)ですか?もしそうなら、 'double d; cin >> d; 'と' std :: string input; std :: cin >> input; 'そして、あなたの基準** _に合っているかどうかを調べるために解析します。 –

答えて

4

C++では、ストリームから値を読み取ろうとすると、予想される形式と一致する限りストリームからできるだけ多くの部分が読み込まれ、他の部分はそのまま残ります。読み込みが全く値を読み取ることができなかった場合は、ストリームに失敗ビットを設定します。これは、あなたがエラーを受け取りますが、ガベージの後に数字を入力すると、有効なデータを読み込みますが、まだストリームに残っているゴミが残っているのに対して、これを回避するために

一つの方法は、ユーザが入力したすべてのものをピックアップし、その後、std::istringstreamを通してそれを実行することにより、それを解析している、cinからテキストの行を読み取るためにstd::getline機能を使用することです。ここでは、これを行うための一つの方法は、我々のイントロクラスにスタンフォード大学で使用するために使用されるいくつかのコードに基づいて、です:

int readInt() { 
    while (true) { 
     std::string input; 
     std::getline(cin, input); // Read a line of text from the user 

     /* Set up an istringstream to read the data */ 
     std::istringstream converter(input); 

     /* Try to read an int. If we succeed, make sure there wasn't 
     * any trailing data. 
     */ 
     int value; 
     if (converter >> value) { 
      char leftover; 
      if (converter >> leftover) { 
       std::cout << "Please enter an integer." << std::endl; 
      } else { 
       return value; 
      } 
     } else { 
      std::cout << "Please enter an integer." << std::endl; 
     } 
    } 
} 

あなたは簡単に最も適切と思われるあらゆる種類のデータを読み取るために、これをテンプレート化/カスタマイズすることができます。

関連する問題