2012-08-22 32 views
1

可能重复:
How do I tokenize a string in C++?字符串分割到令牌 - 没有具体的操作系统功能

strtok的功能不是线程安全的。 Microsoft具有特定于Windows的strtok_s和CString :: Tokenize安全函数。是否有跨平台CRT/C++库的方式来做到这一点,而无需手动编码?

+2

http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c – Andrey

+0

你是要求可移植,*线程安全*标记化?如果是这样,那么也许你可以在标题中提到。 – juanchopanza

回答

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

2

其实,strtok()一般是线程安全的(几乎所有运行时支持多线程的操作系统将有一个线程安全的strtok()) 。 strtok()不能用于以“交替”方式对不同的字符串进行标记,但这是非常罕见的事件,并且处于您的代码控制之下。

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

+0

此外,strtok_r(位于POSIX端)和strtok_s(位于Visual Studio端)具有完全相同的原型和行为。用一个简单的宏将strtok_r映射到Windows目标上的strtok_s,你应该有一个可移植的解决方案。 – greydet