将字符串拆分为令牌 - 没有特定于操作系统的功能

时间:2012-08-22 06:29:55

标签: c++ c string tokenize

  

可能重复:
  How do I tokenize a string in C++?

strtok函数不是线程安全的。 Microsoft具有特定于Windows的strtok_s和CString :: Tokenize安全功能。有没有手动编码的跨平台CRT / C ++库方法吗?

3 个答案:

答案 0 :(得分:5)

boost::splithttp://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

答案 1 :(得分:2)

strtok()的主题安全版本为strtok_r()。它也是POSIX compliant

答案 2 :(得分:2)

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

然而,那说,strtok_r()是一个常见的(虽然不是C标准的一部分 - it's POSIX)变体,它可以让你保持对上下文的控制,这样你就可以兼顾strtok_r() {{1}}在你喜欢的同时上下文。它不适用于MSVC,但您可以在此处找到公共域实现:http://snipplr.com/view/16918/