可能重复:
How do I tokenize a string in C++?字符串分割到令牌 - 没有具体的操作系统功能
strtok的功能不是线程安全的。 Microsoft具有特定于Windows的strtok_s和CString :: Tokenize安全函数。是否有跨平台CRT/C++库的方式来做到这一点,而无需手动编码?
可能重复:
How do I tokenize a string in 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 compliant。
其实,strtok()
一般是线程安全的(几乎所有运行时支持多线程的操作系统将有一个线程安全的strtok()
) 。 strtok()
不能用于以“交替”方式对不同的字符串进行标记,但这是非常罕见的事件,并且处于您的代码控制之下。
然而,这一说,strtok_r()
是一种常见的(虽然不是C标准的一部分 - it's POSIX)的变体,可以让你保持对上下文控制,所以你可以为你喜欢的同时兼顾许多strtok_r()
上下文。它不适用于MSVC,但您可以在此处找到公有域实现:http://snipplr.com/view/16918/
此外,strtok_r(位于POSIX端)和strtok_s(位于Visual Studio端)具有完全相同的原型和行为。用一个简单的宏将strtok_r映射到Windows目标上的strtok_s,你应该有一个可移植的解决方案。 – greydet
http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c – Andrey
你是要求可移植,*线程安全*标记化?如果是这样,那么也许你可以在标题中提到。 – juanchopanza