首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中拆分以空值分隔的字符串序列的简单方法

在C++中拆分以空值分隔的字符串序列的简单方法
EN

Stack Overflow用户
提问于 2011-08-30 21:14:28
回答 7查看 7K关注 0票数 19

我有一系列存储在单个数组中的字符串,由空值分隔(例如,'f','o','o','\0','b','a','r','\0'...),我需要将其拆分为std::vector<std::string>或类似的值。

我可以使用std::findstrlen编写一个10行的循环来完成这项工作(实际上我刚刚就做到了),但我想知道是否有更简单/更优雅的方法来完成这项工作,例如我忽略的一些STL算法,它可以被诱使这样做。

这是一个相当简单的任务,如果有一些聪明的STL技巧可以使它变得更简单,我也不会感到惊讶。

有谁愿意接受吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-08-30 21:20:18

我的两点意见:

代码语言:javascript
复制
const char* p = str;
std::vector<std::string> vector;

do {
  vector.push_back(std::string(p));
  p += vector.back().size() + 1;
} while ( // whatever condition applies );
票数 36
EN

Stack Overflow用户

发布于 2011-08-30 21:18:44

Boost解决方案:

代码语言:javascript
复制
#include <boost/algorithm/string.hpp>
std::vector<std::string> strs;
//input_array must be a Range containing the input.
boost::split(
    strs,
    input_array,
    boost::is_any_of(boost::as_array("\0")));
票数 9
EN

Stack Overflow用户

发布于 2011-08-30 22:02:58

下面的代码依赖于具有隐式构造函数的std::string,该构造函数接受const char*,从而使循环成为非常简单的两行代码:

代码语言:javascript
复制
#include <iostream>
#include <string>
#include <vector>

template< std::size_t N >
std::vector<std::string> split_buffer(const char (&buf)[N])
{
    std::vector<std::string> result;

    for(const char* p=buf; p!=buf+sizeof(buf); p+=result.back().size()+1)
        result.push_back(p);

    return result;
}

int main()
{
    std::vector<std::string> test = split_buffer("wrgl\0brgl\0frgl\0srgl\0zrgl");

    for (auto it = test.begin(); it != test.end(); ++it)
        std::cout << '"' << *it << "\"\n";

    return 0;
}

这个解决方案假设缓冲区的大小是已知的,并且字符串列表的结尾条件是已知的。如果列表由"\0\0"终止,则需要将循环中的条件从p!=foo+sizeof(foo)更改为*p

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7243723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档