在 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