strtok函数不是线程安全的。 Microsoft具有特定于Windows的strtok_s和CString :: Tokenize安全功能。有没有手动编码的跨平台CRT / C ++库方法吗?
答案 0 :(得分:5)
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
答案 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/