get() 與 getline()

  • 類對象 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。

發佈了4 篇原創文章 · 獲贊 5 · 訪問量 2937
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章