1. 程式人生 > 其它 >【C++】使用istringstream根據分隔符分割字串

【C++】使用istringstream根據分隔符分割字串

轉載來自:https://www.cnblogs.com/flix/p/13594908.html 

在 C++ 中,可以使用 istringstream 配合 getline 根據分隔符來分割字串。

istringstream, ostringstream, stringstream區別#

這 3 個 stream 都可以通過標頭檔案 #include <sstream> 引入。三者的區別如下:

  • ostringstream : 用於執行 C 風格字串的輸出操作。
  • istringstream : 用於執行 C 風格字串的輸入操作。
  • stringstream : 同時支援 C 風格字串的輸入輸出操作。

通常,ostringstream 類用來格式化字串,避免申請大量的緩衝區,替代 sprintf。該類能夠根據內容自動分配記憶體,其對記憶體管理也是相當到位。這篇文章中,我們使用 istringstream 來分割字串。

字串分割#

首先,我們使用一個字串s來初始化輸入字串流istringstream

string s = "a/b/c/d";
istringstream iss(s);

然後,我們使用 getline 函式通過 iss 對字串進行分割,getline 函式的原型為

istream& getline ( istream &is , string &str , char
delim );

第一個引數為 is 表示一個 istringstream,這裡就是 iss,第二個引數表示我們要將字串分割的結果通過 getline 逐個放入 str 中,第三個引數為分隔符,注意分隔符只能為字元型。示例如下:

#include <sstream>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    string s = "a/b/c/d";
    istringstream iss(s);
    string buffer;
    
while(getline(iss, buffer, '/')) { cout<<buffer<<endl; } return 0; }

輸出:

如果我們將字串 s 設為 a/b//c//d,程式碼其餘不變,則結果為

可以看到,兩個連續的分隔符會被解析為空串。

封裝#

可以將字串分割簡單地封裝成一個split函式:

#include <sstream>
#include <iostream>
#include <vector>
using namespace std;

/**
*分割字串,輸入待分割的字串s以及分割符sep;
*這裡沒有對分割可能得到的空串進行處理,可以直接刪除空串
*/
vector<string> split(string s, char sep)
{
    istringstream iss(s);
    vector<string> res;
    string buffer;
    while(getline(iss, buffer, sep)){
        res.push_back(buffer);
    }
    return res;
}

int main()
{
    string s = "a/b/c/d";
    vector<string> res = split(s, '/');
    for(int i=0; i<res.size(); i++) cout<<res[i]<<" ";
    cout<<endl;
    return 0;
}

參考#

1、https://blog.csdn.net/qq_36743440/article/details/91999615
2、https://segmentfault.com/a/1190000020863841
3、https://blog.csdn.net/hellokandy/article/details/54585174

 

在 C++ 中,可以使用 istringstream 配合 getline 根據分隔符來分割字串。

istringstream, ostringstream, stringstream區別#

這 3 個 stream 都可以通過標頭檔案 #include <sstream> 引入。三者的區別如下:

  • ostringstream : 用於執行 C 風格字串的輸出操作。
  • istringstream : 用於執行 C 風格字串的輸入操作。
  • stringstream : 同時支援 C 風格字串的輸入輸出操作。

通常,ostringstream 類用來格式化字串,避免申請大量的緩衝區,替代 sprintf。該類能夠根據內容自動分配記憶體,其對記憶體管理也是相當到位。這篇文章中,我們使用 istringstream 來分割字串。

字串分割#

首先,我們使用一個字串s來初始化輸入字串流istringstream

string s = "a/b/c/d";
istringstream iss(s);

然後,我們使用 getline 函式通過 iss 對字串進行分割,getline 函式的原型為

istream& getline ( istream &is , string &str , char delim );

第一個引數為 is 表示一個 istringstream,這裡就是 iss,第二個引數表示我們要將字串分割的結果通過 getline 逐個放入 str 中,第三個引數為分隔符,注意分隔符只能為字元型。示例如下:

#include <sstream>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    string s = "a/b/c/d";
    istringstream iss(s);
    string buffer;
    while(getline(iss, buffer, '/'))
    {
        cout<<buffer<<endl;
    }
    return 0;
}

輸出:

如果我們將字串 s 設為 a/b//c//d,程式碼其餘不變,則結果為

可以看到,兩個連續的分隔符會被解析為空串。

封裝#

可以將字串分割簡單地封裝成一個split函式:

#include <sstream>
#include <iostream>
#include <vector>
using namespace std;

/**
*分割字串,輸入待分割的字串s以及分割符sep;
*這裡沒有對分割可能得到的空串進行處理,可以直接刪除空串
*/
vector<string> split(string s, char sep)
{
    istringstream iss(s);
    vector<string> res;
    string buffer;
    while(getline(iss, buffer, sep)){
        res.push_back(buffer);
    }
    return res;
}

int main()
{
    string s = "a/b/c/d";
    vector<string> res = split(s, '/');
    for(int i=0; i<res.size(); i++) cout<<res[i]<<" ";
    cout<<endl;
    return 0;
}

參考#

1、https://blog.csdn.net/qq_36743440/article/details/91999615
2、https://segmentfault.com/a/1190000020863841
3、https://blog.csdn.net/hellokandy/article/details/54585174