可能重复:
如何在 C++ 中标记字符串?
strtok 函数不是线程安全的。Microsoft 具有 Windows 特定的 strtok_s 和 CString::Tokenize 安全函数。是否有跨平台 CRT/C++ 库方法可以做到这一点而无需手动编码?
可能重复:
如何在 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/