文字列を分解して直接std::stringに詰め込むに方法があるか?

解決


yone  2008-01-15 10:28:05  No: 67299

環境はXP,VC2005,MFCでプログラムを組んでいる初心者です。

 知りたいことは、wchar_t src[xxx]の文字列から
swscanfのような関数で部分文字列を切り取り、std::wstring destに
コピーする関数があるかどうかです。関数1つでdestにコピーできる
関数があるかどうか知りたいです。

 もちろん、以下のように段階的にdestにいれる方法は
わかりますが、直接いれる方法があればシンプルにできますので、
いろいろ調べました。しかしこれに該当する関数は
ないのではという結論にたどり着きました。
確認のためにご意見をいただきたく投稿いたしました。
 以上よろしくお願いいたします。
 
 wchar_t src[xxx];
 std::wstring dest;
 wchar_t str1[xxx], str2[xxx];
 swscanf(src, L"%s %s", str1, str2);
 dest = str2;


επιστημη  URL  2008-01-15 17:49:53  No: 67300

// istringstreamを使った例

#include <iostream>
#include <sstream>

int main() {
  wchar_t input[] = L"input string";
  wchar_t str1[8], str2[8];
  std::wistringstream stream(input);
  stream >> str1 >> str2;
  std::wcout << L'[' << str1 << L']' << std::endl
             << L'[' << str2 << L']' << std::endl;

}


yone  2008-01-15 19:48:28  No: 67301

>επιστημηさん
 早速の回答ありがとうございました。
 自分の調べ方が足りなかったようです。
 επιστημηさんの方法で私が気になっていたことは
 解決しそうです。参考にさせていただきます。
 本当にありがとうございました。


tetrapod  2008-01-15 19:51:52  No: 67302

tokenizer を使ってみた

#include <boost/tokenizer.hpp>

std::wstring source(L"Hello World");
typedef boost::tokenizer<boost::char_delimiters_separator<wchar_t>,
std::wstring::const_iterator, std::wstring> wtokenizer;
wtokenizer tk(source, boost::char_delimiters_separator<wchar_t>(true, L"", L"l"));
for (wtokenizer::iterator it=tk.begin(); it!=tk.end(); ++it) {
    std::wcout << L'<' << *it << L'>' << std::endl;
}
常に2つに分かれるのであれば繰り返す必要は無いが・・・


επιστημη  URL  2008-01-15 22:06:52  No: 67303

あ、直接wstringに>>すればいいのか。

  std::wstring input = L"input string";
  std::wstring dest1, dest2;
  std::wistringstream stream(input);
  stream >> dest1 >> dest2;


yone  2008-01-15 22:07:16  No: 67304

>tetrapod
  回答ありがとうございました。
boostライブラリなるもの,知りませんでした。
トークンの切り出しのアイデアと思いますが,
検討いたします。


yone  2008-01-15 22:33:53  No: 67305

すでに「解決」マークをいれてしまいましたので,
この件については最後にしたいと思います。
皆さんありがとうございました。

>επιστημηさん
 std::wstringを部分文字列に分解する時,
これまでは,swscanfを使っていたため,
必ず部分文字列用の文字列配列を
サイズを気にしながら用意する作り方をしていました。
これがわずらわしくて今回投稿しましたが,
良い方法をお教えいただいてありがとうごさいました。


επιστημη  URL  2008-01-15 22:48:44  No: 67306

istringstreamの利用はあくまで一例です。
切りだしたい部分文字列の位置と長さがわかっているなら
string::substr 使うがベスト。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加