概念
cin.sync()的功能是清空緩衝區,而cin.ignore()雖然也是刪除緩衝區中數據的作用,但其對緩衝區中的刪除數據控制的較精確。
有時候你只想取緩衝區的一部分,而捨棄另一部分,這是就可以使用cin.ignore(),其使用方法是:
cin.ignore(int intExp, char chExp);
其中intExp 是一個整型表達式,也可以是一個整型數值,這個數值表示在一行中忽略的字符的最大數目,比如說intExp=100;還有一個參數chExp,是一個字符表達式。表示如果遇到一個字符值等於chEXP,那麼就停止ignore(),如果ignore100個字符之後還沒遇到值等於chEXP的字符,那也得停止ignore(),所以100是ignore()所忽略的最大字符數。
例子
#include<iostream>
#include<cstdlib>
int main()
{
int ival1 = 0, ival2 = 0;
std::cin >> ival1;
std::cin.ignore(100, '\n');
std::cin >> ival2;
std::cout << "ival1 = " << ival1 << std::endl;
std::cout << "ival2 = " << ival2 << std::endl;
system("pause");
return 0;
}
①按下Enter後,ival1接收了12,剩餘的都被清除掉了,因爲Enter就是本身就是空行符,然後輸入流會等待第二次輸入爲ival2賦值。如過沒有中間那句std::cin.ignore(100, '\n') ,則不會等待第二次輸入,直接輸出ival1 = 12 ival2 = 34:
②把std::cin.ignore(100, '\n')
改成std::cin.ignore(2, '\n')
呢,ival1接收了12之後,ignore清除掉兩個字符:
爲什麼ival2是4而不是78呢?
因爲我們所用的IO對象cin cout 都是操縱char數據的,不管我們輸入的是什麼數據,cin cout 都會轉成 char來處理,例如我們想要輸出的是一個整形變量的值,那麼在輸出前,cout會將該變量的值轉成字符,在進行輸出(C++ Primer Plus中有一句話:In essence, the C++insertion operator adjusts its behavior to fit the type of data that follows it.),所以上面ignore清除掉了一個空格和一個字符3,所以緩衝區中剩餘4、56、78,所以ival2等於4.
③如果cin.ignore()不給參數,則默認參數爲cin.ignore(1,EOF),即把EOF前的1個字符清掉。