C++没有像Python一样提供直接的字符串分割的函数,但依然有方法快速实现,本篇简要总结。

(i)stringstream

头文件:#include <sstream>

作用:

istringstream类用于执行C++风格的字符串流的输入操作。

ostringstream类用于执行C++风格的字符串流的输出操作。

stringstream类同时可以支持C++风格的串流的输入输出操作。

具体用法可参考 初识 istringstream、ostringstream、stringstream 运用

空格

如果空格是分隔符,可以:

string str = "dog cat cat dog";
istringstream in(str);
vector<string> v;
string t;
while (in >> t) {
    v.push_back(t);
}

iterator

// #include <iterator>
copy(istream_iterator<string>(in), istream_iterator<string>(), back_inserter(v));

getline()

如果要指定分隔符,可以用getline()

std::string strData = "apple,bear,orange";
const char separator = ',';
std::vector<string> outputArray;
std::istringstream streamData(strData);
std::string val;

while (std::getline(streamData, val, separator)) {
  outputArray.push_back(val);
}

find()

find 用于查找字符串中特定字符出现的位置,我们可以结合substr或者erase来实现字符串分割。

string str2 = "dog cat cat dog";
vector<string> v;

// substr
while (str2.find(" ") != string::npos) {
  int found = str2.find(" ");
  v.push_back(str2.substr(0, found));
  str2 = str2.substr(found + 1);
}    
v.push_back(str2);


// erase
int pos;
string token, sep = " ";
while ((pos = str2.find(sep)) != string::npos) {
    token = str2.substr(0, pos);
    v.push_back(token.erase(0, token.find_first_not_of(" ")));
    str2.erase(0, pos + sep.size());
}
v.push_back(str2.erase(0, str2.find_first_not_of(" ")));

strtok()

strtok<string.h>中提供的分割字符串的函数。

// #include <stdio.h>
// #include <stdlib.h>  
// #include <string.h>

string str = "dog cat cat dog";
vector<string> v;

char *dup = strdup(str.c_str());
char *token = strtok(dup, " ");
while (token != NULL) {
  v.push_back(string(token));
  token = strtok(NULL, " ");
}
free(dup);

参考

https://www.cnblogs.com/grandyang/p/4858559.html

https://linuxhint.com/split-string-cpp/

最后修改:2022 年 06 月 04 日
如果觉得我的文章对你有用,请随意赞赏