如何在不使用标准Ubuntu版本的其他库的情况下在c ++中拆分字符串?

时间:2013-11-14 07:53:41

标签: c++ string split

我在c ++编程方面比较陌生,所以如果我犯了任何常见的错误,请耐心等待。

我有一个看起来像这样的字符串:

String str = "[abc, abcde, lkejs, abde], [123, 456, 7890]"

我希望将每个值存储到一个向量中,使其看起来像:

abc abcde lkejs abde 123 456 7890

我已经阅读并尝试使用Boost tokenizer,但是我限制在操作系统中安装新的库,而这些代码应该运行。

我也试过strtok(),但这让我更加困惑,因为它将我的整个字符串转换为字符。

通过http://www.cplusplus.com/faq/sequences/strings/split/#boost-split查看,我可能最好使用string::find_first_of(),但可用的示例在帮助我理解其工作原理方面做得不够。

任何人都可以帮助我更好地理解string::find_first_of()的语法,还是有更好的方法来分割字符串而无需像boost那样安装额外的库?

1 个答案:

答案 0 :(得分:2)

第一部分是删除括号和逗号,对于std::string::erasestd::remove_if可能是好的。

str.erase(std::remove_if(std::begin(str), std::end(str), [](const char& ch){
              return ch == '[' || ch == ']' || ch == ',';
          }), std::end(str));

然后你需要标记剩下的字符串,你可以再次使用std::istringstreamstandard algorithm std::copyiterator helpers std::istream_iteratorstd::back_inserter

std::vector<std::string> v;
std::istringstream iss(str);

std::copy(std::istream_iterator<std::string>(iss),
          std::istream_iterator<std::string>(),
          std::back_inserter(v));

注意:我在std::remove_if电话中使用了C ++ 11 lambda expression。如果您没有支持C ++ 11的编译器,它可以简单地用普通函数替换。