在 C++ 中分割字符串

昨天在网上看到,C++ 至今为止没有官方实现的字符串分割函数。相比 Python、Java 等语言,多少是有些不便的。

实际上,利用纯 C++ 风格的代码,也是可以实现一个优雅的字符串分割函数的。

前作中,我们介绍了 C++ 的 std::getline 函数。它接收一个输入流,将输入流至行末/分隔符部分的字符串保存在临时的字符串中;同时,返回输入流的左值引用。考虑到输入流本身可以用作条件判断,我们可以将 std::getlinewhile 循环联用,达成目的。

简单实现如下:

split.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

void split(const std::string& s, std::vector<std::string>& sv, const char delim = ' ') {
sv.clear();
std::istringstream iss(s);
std::string temp;

while (std::getline(iss, temp, delim)) {
sv.push_back(std::move(temp));
}

return;
}

int main() {
std::string s("abc:def:ghi");
std::vector<std::string> sv;

split(s, sv, ':');

for (const auto& s : sv) {
std::cout << s << std::endl;
}

return 0;
}

代码中,我们借助字符串输入流 istringstream 处理带分割的字符串 s。而后将各个 delim 之间的内容,保存在临时字符串 temp 当中,并移动到向量 sv 的末尾。

上述代码的结果是:

1
2
3
abc
def
ghi


您的鼓励是我写作最大的动力

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。


撰写评论

写了这么多年博客,收到的优秀评论少之又少。在这个属于 SNS 的时代也并不缺少向作者反馈的渠道。因此,如果你希望撰写评论,请发邮件至我的邮箱并注明文章标题,我会挑选对读者有价值的评论附加到文章末尾。