轉載來自: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