當 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
當讀取資料時, 應該檢查 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
全站熱搜
留言列表