重複の可能性:
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()
は、一般的にスレッドセーフです(マルチスレッドOSをサポートする実質的にすべてのランタイムにはスレッドセーフがありますstrtok()
)。strtok()
異なる文字列を「交互に」トークン化するために使用することはできませんが、これは非常にまれなケースであり、コードの制御下にあります。
ただし、それはstrtok_r()
一般的な(C標準の一部ではありませんが-POSIXです)バリアントであり、コンテキストの制御を維持できるため、必要な数のstrtok_r()
コンテキストを同時に調整できます。MSVCでは使用できませんが、パブリックドメインの実装は次の場所にあります: http ://snipplr.com/view/16918/