當 cin 無法把輸入的資料成功的轉換成你所設定的類型是, cin 內部設為錯誤狀態, 而無法轉換的資料還在 input buffer 裡.

當讀取資料時, 應該檢查 cin 的 state, 並在有錯誤時處理:

  #include <iostream>
  #include <limits>
  using namespace std;

  int ReadInteger(void)
  {
     int i;
     cout << "Enter integer: " << endl;
     while (!(cin >> i))
     {
        cout << "Input non-integer, try again" << endl;
        cin.clear(); /* 必須先清除錯誤狀態 */

        /* 把還在 buffer 裡, 但無法轉換的資料 "吃掉" */
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
     }
     return i;
  }

  int main(void)
  {
     cout << ReadInteger() << endl;
     return 0;
  }
istream::ignore() 的作用是把 input stream 的 character(s) 讀進來再丟掉. 也就是把 input stream 的一個或多個字元 (characters) 消滅掉.

istream::ignore() 有三個 overload. 第三個是:

   istream::ignore(streamsize count, int delim)

第一個參數告訴 ignore 最多要消滅掉幾個字元.
第二個參數告訴 ignore 何時停止消滅字元的工作.

當 ignore 讀到 'delim' 所設定的字元後, 或是達到 'count' 所設定的數目時, ignore 就會 return. 'delim' 所設定的字元也會丟掉.

'count' 的型態是 'steamsize', 這是一個 typedef. 它的最大值可以用以下的方法來找:
   std::numeric_limits<streamsize>::max()


整個
   cin.ignore(numeric_limits<streamsize>::max(), '\n');

的意思就是: 把從現在起, 以後整行的 input 都丟棄掉.

建議你看這本書:
   "The C++ Standard Library - A tutorial and Reference"
   By Nicolai M. Josuttis

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()