2017-08-20 11 views
-3

私はC++に関する質問があります。私は答えを探していて、私のコードを修正するものは何も見つかりませんでした。そこで私は自分自身に尋ねることにしました。私の問題は、曜日を出力するこの小さなプログラムを作成したことです。ユーザーが1を入力すると、週の第1日(日曜日または月曜日、あなたの住んでいる場所によって異なります)などが出力されます。そうです。しかし、ユーザが例えば8を入力すると、プログラムは「1と7の間の数字を選んでください!」と出力する。 しかし、私の問題は、ユーザーが文字やランダムな単語を入力すると、 "1〜7の数字を選んでください!"というループです。永遠に。C++ Cinは非整数を無視しますか?

#include <iostream> 
#include <Windows.h> 
#include <string> 
using namespace std; 


int main() { 

    int input; 


    do { 
     cin >> input; 
     switch (input) { 
     case 1: 
      cout << "Sunday" << endl; 
      break; 
     case 2: 
      cout << "Monday" << endl; 
      break; 
     case 3: 
      cout << "Tuesday" << endl; 
      break; 
     case 4: 
      cout << "Wednesday" << endl; 
      break; 
     case 5: 
      cout << "Thursday" << endl; 
      break; 
     case 6: 
      cout << "Friday" << endl; 
      break; 
     case 7: 
      cout << "Saturday" << endl; 
      break; 
     default: 
      cout << "Please choose a number between 1 and 7!" << endl; // if user chooses a number not from 1-7 output this. But if input is not an int and for example "a", it will loop this forever. 
      break; 
     } 

    } while (true); 


    return 0; 
} 
+0

これは正常です。 'cin >> input;がOKになったかどうかは決して確認しません。 – user0042

答えて

0

IO操作はストリームの現在の状態に関するフラグを設定します。読み取り/ I/O操作で書き込みエラー

  • failbit - - I/O操作上の論理エラー
  • eofbit

    これらはあなたが入力

    • badbitをを読んであれば気にすべきか、重要なフラグです - ファイルの最後が入力操作に達した

    intを期待するストリームに文字を渡すと(変換できない全体的なデータ型が渡されます)タイプがcinの場合)、failbitが設定されます。

    これは、間違った入力を挿入した後に無限ループに入った理由です。 failbitが設定され、cinがクリアされなかったので、次の読み取り操作も何度も失敗しました。

    failbitの設定を解除し、ignoreを使用して入力バッファから入力を破棄します。 failbitが(間違ったIO動作)に設定されている場合

    std::cin.clear();  // without params clears flags 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Clear input buffer 
    

    std::cin.fail()はあなたを教えてくれます。 eofbitが設定されている場合

    int input; 
    cin >> input; 
    while (! cin.fail()) 
    { 
        // Process data 
        cin >> input; 
    } 
    

    std::cin.eof()EOFに達する、を教えてくれます(STD入力にCTRL + D/+ Z)

    if (cin.eof()) 
    { 
        // End of file (input) reached 
        // Terminate reading 
    } 
    
  • 0

    声明cin >> inputは、例えば、失敗することがありユーザーが整数値に変換できないものを入力した場合、またはストリームがEOF(標準入力のCTRL-DまたはCTRL-Zなど)に達した場合 cin >> inputに障害が発生した場合、次の2つのことが起こります。まず、障害の種類を示すエラー状態が設定されます。次に、式はfalseを返します。これは、inputに値が書き込まれていないことを示します。

    したがって、先に進む前に必ずcin >> ...の結果を確認する必要があります。また、無効な入力を検出した場合は、再度読み込む前にエラーフラグ(cin.clear()を使用)をリセットする必要があります。無効な入力を読み込まないように無効な入力をスキップしたい場合があります(cin.ignore(...))何度も何度も入力:EOFに到達したときに、具体的には、プログラムを終了できるようにする必要があり

    int main() { 
    
        int input; 
        while (true) { 
    
         while (!(cin >> input)) { 
    
          if (cin.eof()) { 
           cout << "user terminated input." << endl; 
           return 0; 
          } 
          cout << "invalid input (not a number); try again." << endl; 
          cin.clear(); 
          cin.ignore(numeric_limits<streamsize>::max(),'\n'); 
         } 
    
         // from here on, you may rely that the user has input a number. 
    
         cout << input; 
    
         // ... your code goes here 
        } 
    
        return 0 ; 
    } 
    

    注意。そうでない場合は、無効なコンテンツを含むファイルをプログラムに入力するときに無限ループに陥ることがあります(例:myProgram < input.txt)。

    関連する問題