C++中是否有类似于PHP中explode()函数的等效函数?

25

可能重复:
在C++中如何拆分字符串

在PHP中,explode() 函数可以将一个字符串按指定的分隔符切割成数组。

在C++中是否有等价的函数?


1
不,但编写自己的实现很容易。 - Kerrek SB
2
boost::split 函数来自 boost/algorithm/string.hpp - Praetorian
@KerrekSB 我认为在此关闭之前,你应该将其作为答案。 - Adrian Cornish
有一个问题的标题类似于“在C++中分割字符串”。它有一些很好的解决方案。 - chris
以下是与 PHP 的 explode() 函数有几个不同之处的答案,这里提供了一个更接近 PHP 的端口 - hanshenrik
2个回答

37

这是一个简单的实现示例:

#include <string>
#include <vector>
#include <sstream>
#include <utility>

std::vector<std::string> explode(std::string const & s, char delim)
{
    std::vector<std::string> result;
    std::istringstream iss(s);

    for (std::string token; std::getline(iss, token, delim); )
    {
        result.push_back(std::move(token));
    }

    return result;
}

使用方法:

auto v = explode("hello world foo bar", ' ');
注意:@Jerry提出的将结果写入输出迭代器的方法在C++中更加惯用。实际上,你可以同时提供一个输出迭代器模板和一个生成向量的包装器,以获得最大的灵活性。
注意2:如果你想跳过空的标记,请添加if (!token.empty())

4
避免复制字符串数据。由于在循环内没有更多使用它的必要,因此向量直接“夺取”这些数据而不复制它是有意义的。 - Kerrek SB
1
它遗漏了一个情况,在输入场景“a,b,c,d,”中,它应返回包括最后一个空值在内的5个值,但它并没有。 - Alok Saini
如果需要,这是我使用的explode_cpp - Alok Saini
@AlokSaini:没错,当前代码具有“可选尾随分隔符”语义,而不是您想要的。最简单的修复方法是添加一个检查,如果s.back() == delim,则在这种情况下发出另一个空字符串。 - Kerrek SB
标准库真的应该添加这个方法:vector<string> std::string::split(char delimiter = ' '); - doctorram
显示剩余3条评论

13

标准库中没有直接等价的函数,但它是一个相当容易编写的函数。由于是C++,通常不会专门编写到数组中--而是通常希望将输出写入迭代器,以便可以传输到数组、向量、流等。这将得到以下类似的代码:

template <class OutIt>
void explode(std::string const &input, char sep, OutIt output) { 
    std::istringstream buffer(input);

    std::string temp;

    while (std::getline(buffer, temp, sep))
        *output++ = temp;
}

我认为std::getline调用中存在错误。在你的代码中,我认为应该将input更改为temp - AntonioCS
1
@AntonioCS:哎呀,非常正确。谢谢! - Jerry Coffin
你会如何处理所有的空格作为分隔符? - pacmaninbw
@pacmaninbw:一个显而易见的可能性是将while循环更改为while (buffer >> temp) - Jerry Coffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接