一. cin>>當碰到空格或換行符'\n'時,輸入結束
該操作符是根據後面變量的類型讀取數據。
輸入結束條件 :遇到Enter、Space、Tab鍵。
對結束符的處理 :丟棄緩沖區中使得輸入結束的結束符(Enter、Space、Tab)
#include <iostream> using namespace std; int main() { char str1[10], str2[10]; cin >> str1; cin >> str2; cout << str1 << endl; cout << str2 << endl; getchar(); return 0; }
【分析】第一次讀取字符串時遇到空格則停止了,將abcd讀入str1,並捨棄了空格,將後面的字符串給了第二個字符串。這證明了cin讀入數據遇到空格結束;並且丟棄空格符;緩沖區有殘留數據,讀入操作直接從緩沖區中取數據。
二.cin.get(數組名,長度,結束符)
其中結束符為可選參數,讀入的字符個數最多為(長度-1)個,結束符規定結束字符串讀取的字符,默認為ENTER
若要讀取字符,直接cin.get(char ch)或ch=cin.get()即可
讀取字符的情況:
輸入結束條件:Enter鍵
對結束符處理:不丟棄緩沖區中的Enter
cin.get() 與 cin.get(char ch)用於讀取字符,他們的使用是相似的,
即:ch=cin.get() 與 cin.get(ch)是等價的。
#include <iostream> using namespace std; int main() { char c1, c2; cin.get(c1); cin.get(c2); cout<<c1<<" "<<c2<<endl; // 打印兩個字符 cout<<(int)c1<<" "<<(int)c2<<endl; // 打印這兩個字符的ASCII值 return 0; }
測試一輸入:
a[Enter]
輸出:
a
97 10
【分析】會發現只執行了一次從鍵盤輸入,顯然第一個字符變量取的’a', 第二個變量取的是Enter(ASCII值為10),這是因為該函數不丟棄上次輸入結束時的Enter字符,所以第一次輸入結束時緩沖區中殘留的是上次輸入結束時的Enter字符!
測試二輸入:
a b[Enter]
輸出:
a
97 32
【分析】顯然第一個字符變量取的’a', 第二個變量取的是Space(ASCII值為32)。原因同上,沒有丟棄Space字符。
讀取字符串的情況:
輸入結束條件:默認Enter鍵(因此可接受空格,Tab鍵),可在第三個參數上自定義結束符
對結束符處理:丟棄緩沖區中的Enter
#include <iostream> using namespace std; int main () { char ch, a[20]; cin.get(a, 5 , 'd'); cin>>ch; cout<<a<<endl; cout<<(int)ch<<endl; return 0; }
測試一輸入:
12345[Enter]
輸出:
1234
53
【分析】第一次輸入超長,字符串按長度取了"1234",而’5′仍殘留在緩沖區中,所以第二次輸入字符沒有從鍵盤讀入,而是直接取了’5′,所以打印的ASCII值是53(’5′的ASCII值)。
測試二輸入:
12d45[Enter]
輸出:
12
100
【分析】第二次輸出為100,說明自定義結束符時不丟棄緩沖區中的結束符
三.cin.getline() 當碰到換行符'\n'或達到所能接受的最大字符數時,輸入結束:
cin.getline(數組名,長度,結束符) 大體與 cin.get(數組名,長度,結束符)類似。
區別在於:
cin.get()當輸入的字符串超長時,不會引起cin函數的錯誤,後面的cin操作會繼續執行,只是直接從緩沖區中取數據。但是cin.getline()當輸入超長時,會引起cin函數的錯誤,後面的cin操作將不再執行。
#include <iostream> using namespace std; int main () { char ch, a[20]; cin.getline(a, 5); cin>>ch; cout<<a<<endl; cout<<(int)ch<<endl; return 0; }
測試輸入:
12345[Enter]
輸出:
1234
-52
【分析】與cin.get()的例子比較會發現,這裡的ch並沒有讀取緩沖區中的5,而是返回了-52,這裡其實cin>>ch語句沒有執行,是因為cin出錯了!