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

解決


yone  2008-01-15 01:28:05  No: 67299  IP: 192.*.*.*

環境は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 08:49:53  No: 67300  IP: 192.*.*.*

// 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 10:48:28  No: 67301  IP: 192.*.*.*

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

編集 削除
tetrapod  2008-01-15 10:51:52  No: 67302  IP: 192.*.*.*

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 13:06:52  No: 67303  IP: 192.*.*.*

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

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

編集 削除
yone  2008-01-15 13:07:16  No: 67304  IP: 192.*.*.*

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

編集 削除
yone  2008-01-15 13:33:53  No: 67305  IP: 192.*.*.*

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

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

編集 削除
επιστημη  URL  2008-01-15 13:48:44  No: 67306  IP: 192.*.*.*

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

編集 削除