■ 文字列を分解して直接std::stringに詰め込むに方法があるか?
yone
2008/01/15(火) 01:28:05 <初心者> 
環境は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;
επιστημη
[HomePage]
2008/01/15(火) 08:49:53
// 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 <初心者> 
[[解決]]
>επιστημηさん
早速の回答ありがとうございました。
自分の調べ方が足りなかったようです。
επιστημηさんの方法で私が気になっていたことは
解決しそうです。参考にさせていただきます。
本当にありがとうございました。
tetrapod
2008/01/15(火) 10:51:52
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つに分かれるのであれば繰り返す必要は無いが・・・
επιστημη
[HomePage]
2008/01/15(火) 13:06:52
あ、直接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 <初心者> 
[[解決]]
>tetrapod
回答ありがとうございました。
boostライブラリなるもの,知りませんでした。
トークンの切り出しのアイデアと思いますが,
検討いたします。
yone
2008/01/15(火) 13:33:53 <初心者> 
[[解決]]
すでに「解決」マークをいれてしまいましたので,
この件については最後にしたいと思います。
皆さんありがとうございました。
>επιστημηさん
std::wstringを部分文字列に分解する時,
これまでは,swscanfを使っていたため,
必ず部分文字列用の文字列配列を
サイズを気にしながら用意する作り方をしていました。
これがわずらわしくて今回投稿しましたが,
良い方法をお教えいただいてありがとうごさいました。
επιστημη
[HomePage]
2008/01/15(火) 13:48:44
istringstreamの利用はあくまで一例です。
切りだしたい部分文字列の位置と長さがわかっているなら
string::substr 使うがベスト。
毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!
