如何在 C++ 中拆分字符串而不将其他库安装到标准 Ubuntu 版本? [复制]

Posted

技术标签:

【中文标题】如何在 C++ 中拆分字符串而不将其他库安装到标准 Ubuntu 版本? [复制]【英文标题】:How do I split a string in c++ without installing additional libraries to standard Ubuntu version? [duplicate] 【发布时间】:2013-11-14 07:53:40 【问题描述】:

我在 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】:

第一部分是去掉括号和逗号,因为这个std::string::erase加上std::remove_if可能很好。

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

然后你需要标记剩余的字符串,你可以再次使用std::istringstream、standard algorithm、std::copy、iterator 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 的编译器,则可以简单地用普通函数替换它。

【讨论】:

remove_if 不会擦除,但它会移动并返回新范围末尾的迭代器。结果 str 将是“abc abcde lkejs abde 123 456 7890456, 7890]”。在接下来的步骤中进行标记时,这可能会导致意外。 @PhillipKinkade 好的,注意到了。更新了答案以执行 remove_if 参考中的示例。 虽然聪明,但我会非常害怕在输入中输入[123,456],因为这种方法会将其变成123456。而不是remove_if 我会提出一个for (char&amp; c: str) if (c == '[' ...) c = ' '; 解决方案...看到它on coliru @MatthieuM。也许使用std::replace_if 将那些特殊字符替换为空格? @JoachimPileborg:哇!我什至不知道这存在!是的,在这种情况下replace_if 听起来很完美:)

以上是关于如何在 C++ 中拆分字符串而不将其他库安装到标准 Ubuntu 版本? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在离子应用程序中使用库而不将其发布到 npm

捕获标准输入而不将字符回显到屏幕

iOS如何显示具有资产库路径的图像而不将它们绑定到实例变量

kickass.to 如何在我们自己的浏览器中发送远程 url/文件而不将我们发送到其他站点?

如何在不将空值发送到输出数组的情况下拆分字符串

如何安装 React Native 应用程序而不将其发布到任何商店?