前言
C++语言作为一门神级语言,在基于C语言的基础上加入多种新特性,各种新的语法糖,以及容器,算法库,好用的一批。尤其是string类,可完全替换c中的char *
string的功能很强大,它提供了一些很好的接口来帮助我们操作字符串,但好像没有提供一种字符串分割的方法,不过可以基于string类的原生接口,加上容器来实现字符串的分割方法,下面介绍一种C++string
分割的方法,基于string
和vector
。
一、废话不多说,直接上代码
#include <iostream>
#include <string>
#include <vector>
// using namespace std;
std::vector<std::string> split(const std::string& source, const std::string& s)
{
std::vector<std::string> result;
std::string::size_type pos = 0;
std::string::size_type prev = 0;
while ((pos = source.find(s, prev)) != std::string::npos) {
auto r = source.substr(prev, pos - prev);
r.size() ? result.push_back(r) : (void)(nullptr);
prev = pos + s.length();
}
auto r = source.substr(prev);
r.size() ? result.push_back(r) : (void)(nullptr);
return result;
}
二、std::cout打印std::vector容器
- 为了使代码打印的好看一些,我们可以重载一下,
operator<<
这个接口好让std::cout
能支持打印std::vector
容器,接口如下。
template <typename T>
std::ostream& operator<<(std::ostream& out, const std::vector<T>& v)
{
out << "{\n";
for (const auto& item : v) {
out << "\t" << item << ",\n";
}
out << "}";
return out;
}
如此我们便能使用std::cout
打印std::vector<std::string>
类型的容器了。
三、验证代码
我们写下mian函数,生成可执行程序,main函数可写成这样。
int main(int argc, char* argv[])
{
std::cout << split("/dev/auto/vvv/iiii/hhh", "/") << std::endl;
std::cout << split("11123332444426666", "2") << std::endl;
return 0;
}
我们编译这个文件,g++ split.cpp -o split
然后执行这个可执行文件 ./split
效果如图:
我们将"/dev/auto/vvv/iiii/hhh"
这个字符串按照"/"
分割,得到的结果是,"dev"
,"auto"
, "vvv"
, "iiii"
, "hhh"
,结果完全正确。
我们将"11123332444426666"
这个字符串按照"2"
来分割,得到的结果是, "111"
,"333"
, "4444"
, 和"6666"
这个结果也是正确的。
分割成功!!!。
四、完整代码
#include <iostream>
#include <string>
#include <vector>
// using namespace std;
std::vector<std::string> split(const std::string& source, const std::string& s)
{
std::vector<std::string> result;
std::string::size_type pos = 0;
std::string::size_type prev = 0;
while ((pos = source.find(s, prev)) != std::string::npos) {
auto r = source.substr(prev, pos - prev);
r.size() ? result.push_back(r) : (void)(nullptr);
prev = pos + s.length();
}
auto r = source.substr(prev);
r.size() ? result.push_back(r) : (void)(nullptr);
return result;
}
template <typename T>
std::ostream& operator<<(std::ostream& out, const std::vector<T>& v)
{
out << "{\n";
for (const auto& item : v) {
out << "\t" << item << ",\n";
}
out << "}";
return out;
}
int main(int argc, char* argv[])
{
std::cout << split("/dev/auto/vvv/iiii/hhh", "/") << std::endl;
std::cout << split("11123332444426666", "2") << std::endl;
return 0;
}
五、总结
本文实现了一种C++中字符串的分割方法,字符串的分割是很常用的方法,有了这种方法,便可很方便的对C++中的字符串进行处理,亲测可用。