如何在 c++ 中拆分字符串而不将其他库安装到标准 Ubuntu 版本

How do I split a string in c++ without installing additional libraries to standard Ubuntu version?

本文关键字:安装 其他 标准 版本 Ubuntu c++ 拆分 字符串      更新时间:2023-10-16

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

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

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

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

abc abcde lkejs abde 123 456 7890

我已经阅读并尝试使用 Boost 标记器,但我被限制将新库安装到应该运行此代码的操作系统中。

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

浏览 http://www.cplusplus.com/faq/sequences/strings/split/#boost-split,我可能最好使用string::find_first_of()但是那里提供的示例在帮助我理解它是如何工作的方面并没有多大作用。

谁能帮助我更好地理解string::find_first_of()的语法,或者是否有更好的方法来拆分字符串而无需像 boost 那样安装额外的库?

第一部分是去掉括号和逗号,因为这个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 ,以及标准算法std::copy,迭代器助手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 表达式。如果您没有支持 C++11 的编译器,则可以简单地将其替换为普通函数。