一、cin
cin從輸入緩沖區中讀取資料,遇到結束符(Tab、Space、Enter)時輸入結束,并且結束時結束符并不會丢棄,而是保留在輸入緩沖區中。cin開始讀取資料時遇到結束符時會直接忽略,也就是當輸入緩沖區第一個資料為結束符時,cin會忽略并丢棄結束符。
注意:當cin或者cin.get()與getline()同時出現時,需要注意緩沖區中的結束符。
char ch1;
cin >> ch1;
cout << (int)ch1 << endl;
char ch2 = cin.get();
cout << (int)ch2 << endl;
當輸入1+Enter時,輸出49和10(1對應的ASCII碼為49,\n對應的ASCII碼為10),說明結束符保留在緩沖區内;
當輸入Space+1+Enter時,輸出同上,說明讀取時忽略了結束符;
二、cin.get()
cin.get()從輸入緩沖區中讀取一個字元,對于緩沖區的Space、Tab、Enter不敏感,可以讀取這些符号。
三、cin.get(數組,長度,結束符)
cin.get(數組,長度,結束符)從緩沖區中讀取出(長度-1)的字元串或者遇到結束符時結束讀取資料(結束符保留在緩沖區内),不定義第三個參數時,結束符預設為\n;
char ch1, str[5];
cin.get(str, 4,'a' );
cout << str << endl;
cin >> ch1;
cout << ch1 << endl;
當輸入12345+Enter時,輸出123和4,說明該函數讀取的(長度-1)個字元,第一次讀取了123,而4和5仍保留在緩沖區内;
當輸入1a345+Enter時,輸出1和a,說明當遇到結束符時,讀取結束并且結束符保留在緩沖區内;
四、cin.getline(數組, 長度, 結束符)
cin.getline(數組, 長度, 結束符)從緩沖區中讀取出(長度-1)的字元串或者遇到結束符時結束讀取資料(結束符不會保留在緩沖區内),不定義第三個參數時,結束符預設為\n;
但是輸入的字元串超過長度長時,會引起cin函數的錯誤,後面的cin出錯;而cin.get(數組, 長度, 結束符)函數不會引起錯誤,後面的cin操作會繼續從緩沖區中讀取資料,不會引起異常;
char ch1, str[10];
cin.getline(str, 5);
cout << str << endl;
ch1 = cin.get();
cout << (int)ch1 << endl;
當輸入12345+Enter時,輸出1234和-1,說明讀取讀取了(長度-1)個字元,并且後面讀取異常;
當輸入1234+Enter時,輸出12和4,說明讀取到結束符時停止,并且将結束符從緩沖區中丢棄;
char ch1, str[10];
cin.getline(str, 5, 'a');
cout << str << endl;
ch1 = cin.get();
cout << (int)ch1 << endl;
當輸入1234a+Enter時,輸出1234和10,說明結束符a被丢棄,10為\n的ASCII碼;
當輸入12345+Enter時,輸出1234和-1,說明讀取讀取了(長度-1)個字元,并且後面讀取異常;
五、getchar()
getchar()從緩沖區中讀取一個字元,對于緩沖區的Tab、Space、Enter等符号不敏感,類似于不接受參數的cin.get()函數;
六、getline()
istream& getline (istream& is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
istream& getline (istream& is, string& str);
istream& getline (istream&& is, string& str);
getline()從流中讀取一個字元串,可以自定義讀取結束符,預設結束符為換行符,讀取結束時,結束符不保留在緩沖區内;
char ch1;
string str;
getline(cin, str);
cout << str << endl;
ch1 = cin.get();
cout << (int)ch1 << endl;
當輸入123456+Enter+1時,輸出123456和49,結束符沒有保留在緩沖區;
char ch1;
string str;
getline(cin, str,'a');
cout << str << endl;
ch1 = cin.get();
cout << (int)ch1 << endl;
當輸入123a123+Enter時,輸出123和49。