プロが教えるわが家の防犯対策術!

こんにちは。
いつもお世話になっております。

CStringのFindメソッドで文字列検索を行っているのですが、文字列ではなくコードで検索が行われてしまい困っています。
-------------------------------------------------------

CString TargetStr;

TargetStr = "ハヒフヘホ";
if(TargetStr.Find("z", 1) != -1){
return FALSE;
}

-------------------------------------------------------

上記で文字"ホ"のコードが「837A」で"z"が「7A」のため、
文字列が存在するという結果が帰ってきます。
コードではなく文字そのものの検索をするにはどうしたらよいでしょうか?
基本的なことで申し訳ありませんが、ご教示下さい。

<環境>
Windows 2000, VC6.0

A 回答 (5件)

CString::Findメソッドは、1バイトごとの検索を行うので、そのような結果になってしまいます。



このような処理を避けるには、CString::Findではなく、_mbsstrを利用します。
詳しくは、MSDNを参照のこと。
http://msdn.microsoft.com/library/ja/default.asp …

どちらかといえば、_tcsstrを利用してUnicodeとMBCSの両方に対応できるようにしておいたほうがいいです。
#この場合、_UNICODEもしくは_MBCSのどちらかが設定されていないと正しく動きません。

*注意*
この関数はANSIに互換性がないようですので、Windows以外では利用できない可能性があります。


また、上記のような関数を使わず、自分で実装するなら、以下の参考URLを参考にしてください。

参考URL:シフトJIS文字列の文字検索

参考URL:http://katsura-kotonoha.sakura.ne.jp/prog/c/tip0 …
    • good
    • 0
この回答へのお礼

circuitさん、コメントありがとうございます。
返事遅くなり申し訳ありません。
_mbsstrを使用する方向で行きたいと思いますがつまづいています。
また機会があればご教示下さい。

お礼日時:2006/10/03 22:59

#4です。



> *注意*
> この関数はANSIに互換性がないようですので、Windows以外では利用できない可能性があります。

を以下のように訂正。

*注意*
この関数はANSIに互換性がないようですので、VC以外では利用できない可能性があります。
VC6.0はもっていないのでわかりませんが、
VS.NET2005及びBorlandC++Complierにて動作を確認しました。
    • good
    • 0

#2です。

ミスがあったので訂正します。

 CStringW TargetStrW = L"ハヒフヘホ";
 if(TargetStrW.Find(L"z",+)!=-1){
  return FALSE;
 }
    • good
    • 0

VC6でCStringWが使えるかどうかはわかりませんが(手元にVC8(2005)しかありません)


使えるなら
 CStringW TargetStrW = L"";
 if(TargetStrW.Find(L"ハヒフヘホ",1)!=-1){
  return FALSE;
 }
とする方法があります。もちろんこれだとUNICODE→ANSIに変換するプロセスも必要になるでしょう。

そうでなければCStringを継承するなりして
自作する必要があります。
継承ではありませんが以下のようにして判定できます。

 CString TargetStr = "ハヒフヘホ";
 const char *searchstr = "z";
 for( int i = 0 ; i < TargetStr.GetLength() ; i++ ){
  if ( *(TargetStr.GetBuffer()+i) < (char)0 ){
   i++;
   continue;
  }
  if ( strncmp( TargetStr.GetBuffer()+i , searchstr , strlen(searchstr) ) == 0 ){
   return FALSE;
  }
 }

参考URL:http://www.doumo.jp/postgretips/tips.jsp?tips=18
    • good
    • 0
この回答へのお礼

sha-girlさん、コメントありがとうございます。
返事遅くなり申し訳ありません。
残念ながら、VC6でCStringWは使用できませんでした。

お礼日時:2006/09/29 19:40

デフォルトでお望みの動作をするものは、少なくとも私の記憶にはありません。



検索されたインデックスの位置にある文字がマルチバイト文字の一部か否かを判定して、もしマルチバイト文字の一部ならば次を検索・・・みたいな感じでしょうか。

#判定の仕方はキャラクタセットによって変わってくるので割愛します
    • good
    • 0
この回答へのお礼

FAYさん、コメントありがとうございます。
返事遅くなり申し訳ありません。

お礼日時:2006/09/29 19:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A