環境は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;
// 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;
}
>επιστημηさん
早速の回答ありがとうございました。
自分の調べ方が足りなかったようです。
επιστημηさんの方法で私が気になっていたことは
解決しそうです。参考にさせていただきます。
本当にありがとうございました。
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つに分かれるのであれば繰り返す必要は無いが・・・
あ、直接wstringに>>すればいいのか。
std::wstring input = L"input string";
std::wstring dest1, dest2;
std::wistringstream stream(input);
stream >> dest1 >> dest2;
>tetrapod
回答ありがとうございました。
boostライブラリなるもの,知りませんでした。
トークンの切り出しのアイデアと思いますが,
検討いたします。
すでに「解決」マークをいれてしまいましたので,
この件については最後にしたいと思います。
皆さんありがとうございました。
>επιστημηさん
std::wstringを部分文字列に分解する時,
これまでは,swscanfを使っていたため,
必ず部分文字列用の文字列配列を
サイズを気にしながら用意する作り方をしていました。
これがわずらわしくて今回投稿しましたが,
良い方法をお教えいただいてありがとうごさいました。
istringstreamの利用はあくまで一例です。
切りだしたい部分文字列の位置と長さがわかっているなら
string::substr 使うがベスト。
ツイート | ![]() |