- 類對象 cin
cin 以空格、換行符、製表符來確定字符串的結束位置,這一點與 scanf()、get() 這些標準 C 函數是相同的。而在 istream 類的實現中,還有兩個極其常用的函數 get() 與 getline()。
- getline()
getline() 函數讀取整行,它通過換行符來確定行的結束,調用方法是:
cin.getline(arr, len);
getline 的第一個參數是數組名(數組地址),第二參數是數組的總長度。而 getline 讀取的最大數組長度是 len - 1 。且會讀取換行符並丟棄(用 '\0' 替換它)。
- get()
get() 函數與 getline() 類似,但 get 並不再讀取換行符並丟棄換行符,而是把它留在輸入隊列中,調用方法是:
cin.get(arr, len);
get() 函數還有另一種變體,它只讀取一個字符(包括換行符),調用方法是:
cin.get();
至於爲什麼會有 cin.get() 的變體,其實道理很簡單,因爲要清理留在緩衝區的換行符,不然下一次調用 get() 時,則遇到換行符就結束了,什麼都讀取不到。例如以下代碼:
#include <iostream>
int main()
{
using namespace std;
const int ArSize = 20;
char name[ArSize];
char address[ArSize];
cout << "Enter your name: \n";
cin.get(name, ArSize);
cout << "Enter your address: \n";
cin.get(address, ArSize);
cout << "Your name is " << name << endl;
cout << "And live in " << address << endl;
return 0;
}
您可能會很驚奇在輸入完姓名和地址之後,竟然沒有顯示輸入的地址。這就是因爲第一次在調用 get 時,get 並沒有清理留在緩衝區的換行符,而第二次調用 get 時,由於 get 是行緩衝的,則不會讀取任何數據。
其實解決這個很簡單,只需要再加入一個變體,調用方法是:
cin.get(arr, len).get();
這種方法很常用,當第一個 get(arr, len) 在讀完緩衝區且遇到換行符時,就會把 cin 類對象交給 get() 這時就能清理留在緩衝區中的換行符了。它其實就相當於:
cin.get(arr, len); // 讀取緩衝區中的數據,並保存到arr
cin.get(); // 清理上次調用留下的換行符,以確保下次輸入
區別在於第一種的更加精簡,與華麗。
值得注意的是 get() 在讀取空行之後會設置失效位,這意味着接下來的輸入會被阻斷,這時候我們需要一個函數來恢復輸入。
cin.clear()
cin.clear 能夠恢復輸入,即是設置失效位爲 0。