文字列の部分検索

[戻る]
tubaru 2007/01/03(水) 16:08:20
開発環境:Windows XP VC++.net 2003 非MFC
XMLから取り出した要素に、入力した文字が含まれているか検索し、
含まれている場合は取り出した要素をリストボックスに表示するプログラム
をつくっています。

XMLの構造は以下のようになっています。
<main>
  <aaa>
       <bbb>BBB</bbb>
       <ccc>CCC</ccc>
       <ddd>
            <eee>EEE</eee>
            <fff>FFF</fff>
       </ddd>
  </aaa>
</main>

タグ<ddd>の要素(文字列)を get_text によって連結して返しています。
また、現在のソースは以下のようになっています。

for(i=0; i<n; i++){
   if(wcsstr(node[i].bstrVal,_bstr_t(szBuf))!=NULL) 
     ListBox_AddString(hList1,(_bstr_t)node[i].bstrVal);
}

node[i]にはXMLから取得した要素(連結された文字列)、szBufには入力した文字が格納
されていることは確認できました。
コンパイルは通るのですが、実行するとエラーが発生し終了してしまいます。
get_textやwcsstrなどをネットなどで調べてみたのですが原因がわかりません。
どのように変更すればいいのでしょうか?

PATIO 2007/01/04(木) 12:31:31
発生しているエラーの内容が全く提示されていませんので
これで答えてくれと言われても難しいと思います。
nodeとかszBufに関しても宣言部とかが無いのでスコープ等の問題かどうかも
わかりませんし。

特にエラーの内容に関しては状況を知る為の大切な情報ですから
これを書かないと話が始まりません。
このままにしていても有効なレスはつかないと思います。

tubaru 2007/01/04(木) 15:47:31
PATIOさんのおっしゃるとおり、エラーの内容や宣言などを記述しないで質問しては
答えようがないですね。すいません。。。

宣言は
_variant_t node[10]; ←検索対象の文字列
char       szBuf[10]; ←検索したい文字列が格納されている
となっていて、node の文字列は以下のように、get_text で連結した文字列が
入っています。

CComBSTR bstrText[10];
中略
pNode->get_text(&bstrText[0]); 
node[0]=bstrText[0];
            
エラーは
for(i=0; i<n; i++){  
   if(wcsstr(node[i].bstrVal,_bstr_t(szBuf))!=NULL) 
     ListBox_AddString(hList1,(_bstr_t)node[i].bstrVal);
}

↑のプログラムの if 文のところでハンドルされていない Win32 の例外が
発生しました。というものです。
wcsstr 関数の検索対象文字列を文字を連結せず、要素1つ1つを get_nodeValue で取
得した場合はエラーが出ず、正しく動作したことから、検索対象文字列に問題があるこ
とはわかりました。
連結した文字列で部分文字列検索を行いたいのですが、どのようにエラーの対処を
おこなえばいいのでしょうか??

Blue 2007/01/04(木) 16:07:20
n はいくつでしょうか?


とりあえず1次的にばらせるだけばらしてみて確認してみてください。

>   if(wcsstr(node[i].bstrVal,_bstr_t(szBuf))!=NULL) 
>     ListBox_AddString(hList1,(_bstr_t)node[i].bstrVal);
_bstr_t tmp1(nod[i].bstrVal);
_bstr_t tmp2(szBuf);

const wchar_t* pos;
pos = wcsstr(tmp1, tmp2);
if (pos != NULL)
{
    ListBox_AddString(hList1, tmp1);
}

これで、どこまで実行できるか確認してみてください。

Blue 2007/01/04(木) 16:55:25
ちなみに、
>CComBSTR bstrText[10];
>中略
>pNode->get_text(&bstrText[0]); 
>node[0]=bstrText[0];
get_textを使わなくても、textプロパティ(?)で_bstr_t型の値を取得することが出来ま
す。

_bstr_t bstrText[10];
中略
bstrText[0] = pNode->text;
// _variant_t型の変数に入れるのはなぜ?
// そのまま_bstr_t型で持っていればいいと思うんだけど。

tubaru 2007/01/04(木) 17:23:59
[[解決]]
>n はいくつでしょうか?
>
n はXMLの取り出したいノードの要素数です。

>とりあえず1次的にばらせるだけばらしてみて確認してみてください。
>_bstr_t tmp1(nod[i].bstrVal);
>_bstr_t tmp2(szBuf);
>
>const wchar_t* pos;
>pos = wcsstr(tmp1, tmp2);
>if (pos != NULL)
>{
>    ListBox_AddString(hList1, tmp1);
>}
>これで、どこまで実行できるか確認してみてください。

Blueさんがおっしゃったように↑で確認してみると、i が n-1 になったときに
エラーとなっていることがわかりました。
XMLファイルの取り出したい要素をすべて取り出しているつもりでしたが、
ラストチャイルドが取得できていなかったため、i が n-1 になったとき
エラーが出ていました。
ラストチャイルドをちゃんと取得するよう直したところ、正しく実行できるように
なりました。
できるだけ展開して、どこまで実行できるか確認すればこんなにはっきりエラーの
原因がわかるものなんですね。。。

Blueさん、PATIOさんご指導いただきありがとうございます。

tubaru 2007/01/04(木) 17:30:49
[[解決]]
// _variant_t型の変数に入れるのはなぜ?
// そのまま_bstr_t型で持っていればいいと思うんだけど。
確かにそうですね。。。プログラミング中は何か考えがあって
そうしたんだと思うんですが。。。
いろいろ無駄なことをしてしまっています。。。
その辺も直しながら続きをやっていこうと思います。
Blueさんありがとうございました。

古いスレッドには追加発言できません。