C++ getline函數用法詳解

2020-07-16 10:04:37
雖然可以使用 cin 和 >> 運算子來輸入字串,但它可能會導致一些需要注意的問題。

當 cin 讀取資料時,它會傳遞並忽略任何前導白色空格字元(空格、製表符或換行符)。一旦它接觸到第一個非空格字元即開始閱讀,當它讀取到下一個空白字元時,它將停止讀取。以下面的語句為例:

cin >> namel;

可以輸入 "Mark" 或 "Twain",但不能輸入 "Mark Twain",因為 cin 不能輸入包含嵌入空格的字串。下面程式演示了這個問題:
// This program illustrates a problem that can occur if
// cin is used to read character data into a string object.
#include <iostream>
#include <string> // Header file needed to use string objects
using namespace std;

int main()
{
    string name;
    string city;
    cout << "Please enter your name: ";
    cin >> name;
    cout << "Enter the city you live in: ";
    cin >> city;
    cout << "Hello, " << name << endl;
    cout << "You live in " << city << endl;
    return 0;
}
程式輸出結果:

Please enter your name: John Doe
Enter the city you live in: Hello, John
You live in Doe

請注意,在這個範例中,使用者根本沒有機會輸入 city 城市名。因為在第一個輸入語句中,當 cin 讀取到 John 和 Doe 之間的空格時,它就會停止閱讀,只儲存 John 作為 name 的值。在第二個輸入語句中, cin 使用鍵盤緩衝區中找到的剩餘字元,並儲存 Doe 作為 city 的值。

為了解決這個問題,可以使用一個叫做 getline 的 C++ 函數。此函數可讀取整行,包括前導和嵌入的空格,並將其儲存在字串物件中。

getline 函數如下所示:

getline(cin, inputLine);

其中 cin 是正在讀取的輸入流,而 inputLine 是接收輸入字串的 string 變數的名稱。下面的程式演示了 getline 函數的應用:
// This program illustrates using the getline function
//to read character data into a string object.
#include <iostream>
#include <string> // Header file needed to use string objects
using namespace std;

int main()
{
    string name;
    string city;
    cout << "Please enter your name: ";
    getline(cin, name);
    cout << "Enter the city you live in: ";
    getline(cin, city);
    cout << "Hello, " << name << endl;
    cout << "You live in " << city << endl;
    return 0;
}
程式輸出結果:

Please enter your name: John Doe
Enter the city you live in: Chicago
Hello, John Doe
You live in Chicago