将字符串拆分为令牌-不包含操作系统特定的函数

Split string into tokens - without OS-specific functions

本文关键字:操作系统 函数 包含 拆分 字符串 令牌      更新时间:2023-10-16

可能重复:
如何在C++中标记字符串?

strtok函数不是线程安全的。Microsoft具有特定于Windows的strtok_s和CString::Tokenize安全函数。有没有跨平台CRT/C++库的方法可以在没有手动编码的情况下做到这一点?

boost::split。http://www.boost.org/doc/libs/1_51_0/doc/html/string_algo/reference.html#header.boost.algorithm.string.split_hpp

使用示例

#include <vector>
#include <string>
#include <boost/algorithm/string.hpp>
int main()
{
   const std::string s = "hello and what";
   std::vector<std::string> v;
   boost::split(v, s, [](char c) { return c == ' '; }, boost::token_compress_on);
   for (const auto& str : v)
   {
      std::cout << str << std::endl;
   }
}

http://liveworkspace.org/code/3dfc9ee9c8497741f9976ac41a14a390

或者使用boost::tokenizer

strtok()的线程安全版本是strtok_r()。它也符合POSIX。

实际上,strtok()通常是线程安全的(实际上,任何支持多线程操作系统的运行时都会有线程安全的strtok())。strtok()不能用于以"交替"的方式标记不同的字符串,但这种情况非常罕见,并且受代码控制。

然而,也就是说,strtok_r()是一个常见的(虽然不是C标准的一部分,但它是POSIX)变体,可以让您保持对上下文的控制,这样您就可以随心所欲地同时处理任意多的strtok_r()上下文。它不适用于MSVC,但您可以在此处找到公共域实现:http://snipplr.com/view/16918/