如何在 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_iterator
和 std::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& c: str) if (c == '[' ...) c = ' ';
解决方案...看到它on coliru
@MatthieuM。也许使用std::replace_if
将那些特殊字符替换为空格?
@JoachimPileborg:哇!我什至不知道这存在!是的,在这种情况下replace_if
听起来很完美:)以上是关于如何在 C++ 中拆分字符串而不将其他库安装到标准 Ubuntu 版本? [复制]的主要内容,如果未能解决你的问题,请参考以下文章