スポンサーリンク

| キーワード:

C++でsplit (1) – strtok版

strtokによる分割プログラム

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());
}

strtokで生じる問題

実験1

分割文字が連続していても思った通りに分割出来る

std::vector<std::string> cret = 
split_mb("hello world characters", " ");

結果

[hello][world][characters]

実験2

此は成功する

std::vector<std::string> cret = 
split_mb("C:\\test\\english folder\\contents\\", "\\");

結果

[C:][test][english folder][contents]

実験3

「表示」のように分割文字が入っている場合は、思ったような結果が得られない

std::vector<std::string> cret = 
split_mb("C:\\test\\日本語表示フォルダ\\内容\\", "\\");

結果

[C:][test][日本語評[示フォルダ][内容]

C++でsplit (1) – strtok版

C++でsplit (2) – マルチバイト版,’\’対応

C++でsplit (3) – utf16版

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: