strtokを使った典型的なsplitの結果をstringのvectorに格納する。
ありきたりだがとりあえず此が一番事故がない。
#include <string.h> #include <vector> //! @brief 文字列分割関数(マルチバイト文字版) //! @param [in] src 対象の文字列 //! @param [in] del 区切り文字を列挙した文字列 //! @return 分割後の文字列 std::vector<std::string> split_mb(const char* src, const char* del) { std::vector<std::string> result; //strtokは元の文字列を書き換えるので //作業用の領域を作って元データをコピーする std::vector<char> vtxt(strlen(src) + 1,'\0'); char *txt = &vtxt[0]; strcpy(txt, src); char* t = strtok(txt, del); if (strlen(t) != 0) { result.push_back(t); } while (t != NULL) { t = strtok(NULL, del); if (t != NULL) { result.push_back(t); } } return result; } //! @brief 文字列分割関数(ワイド文字版) //! @param [in] src 対象の文字列 //! @param [in] del 区切り文字を列挙した文字列 //! @return 分割後の文字列 std::vector<std::wstring> split_wc(const wchar_t* src, const wchar_t* del) { std::vector<std::wstring> result; std::vector<wchar_t> vtxt(wcslen(src) + 1, '\0'); wchar_t* txt = &vtxt[0]; wcscpy(txt, src); wchar_t* t = wcstok(txt, del); if (wcslen(t) != 0) { result.push_back(t); } while (t != nullptr) { t = wcstok(nullptr, del); if (t != nullptr) { result.push_back(t); } } return result; }
for (size_t i = 0; i < cret.size(); i++) { printf("[%s]",cret[i].c_str()); }
分割文字が連続していても思った通りに分割出来る
std::vector<std::string> cret =
split_mb("hello world characters", " ");
[hello][world][characters]
此は成功する
std::vector<std::string> cret =
split_mb("C:\\test\\english folder\\contents\\", "\\");
[C:][test][english folder][contents]
「表示」のように分割文字が入っている場合は、思ったような結果が得られない
std::vector<std::string> cret =
split_mb("C:\\test\\日本語表示フォルダ\\内容\\", "\\");
[C:][test][日本語評[示フォルダ][内容]