vector<int> iv1, iv2;
cout << "請為第一個vector容器裝填整數元素,以s結尾:" << endl;
int num = 0;
while(cin >> num)
{
iv1.push_back(num);
}
print(iv1.begin(), iv1.end()); // 自己寫的打印容器函數
//cin.clear();
//cin.sync();
cout << "請為第二個vector容器裝填整數元素,以s結尾:" << endl;
while(cin >> num)
{
iv2.push_back(num);
}
cout << "iv2: " << endl;
print(iv2.begin(), iv2.end());
上面這段代碼在為第一個容器填入數據之後,再為第二個容器填入數據時會直接跳過循環,直接輸出第二個容器。
下面附上我的調試過程:
1.加上cin.clear() 調試,無效。 // clear函數用來把錯誤狀態修正,因為第一次循環中有cin>>num,輸入了s對應的類型不對,所以會有錯誤狀態
2.加上了cin.get(),還是無效,我的想法是會不會是我輸入的s這個字符還在緩沖區,用cin.get()吃掉,仍然失敗。。。
3.沒轍了,用c語言的清除緩沖區:scanf("%*[^\n]");scanf("%*c");沒用。。。
4.百度搜了一下,發現了一個函數cin.sync();准確的講是sync()函數,完美解決問題,這個就是輸入流的清除緩沖區函數.
5.今天早上來完善後備功能時,仔細想了想,昨天用cin.get()時真的把字符s清掉了嗎?沒有!!!因為我打完s之後有一個回車鍵,所以要兩個cin.get()才能吃掉字符s.
算是告一段落吧,總之cin.clear()清除錯誤狀態,cin,sync()是清緩沖區。