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

度々お世話になってます。VC++2010、MFC、ユニコードを使う設定で、ワイルドカードを用いたLike処理が使いたいです。

正規表現までは、望んでいません。

それで、過去ログを見てみましたが、まだ分かりませんでした。

◆ワイルドカードを用いた文字列検索
http://oshiete.goo.ne.jp/qa/287644.html を使いたいです。

一応、リンク先のソースコードを載せておきます。
_________________________________________________________________________________________________

int StrMatchMBS( const unsigned char *Ptn, const unsigned char *Str )
{
  switch( *Ptn )
  {
    case '\0':
      return (_mbsnextc(Str)=='\0');
    case '*':
      return StrMatchMBS( _mbsinc(Ptn), Str ) || (_mbsnextc(Str)!='\0') && StrMatchMBS( Ptn, _mbsinc(Str) );
    case '?':
return (_mbsnextc(Str)!='\0') && StrMatchMBS( _mbsinc(Ptn), _mbsinc(Str) );
    default:
      return (_mbsnextc(Ptn)==_mbsnextc(Str)) && StrMatchMBS( _mbsinc(Ptn), _mbsinc(Str) );
  }
}

_________________________________________________________________________________________________

int KeywordDlg::StrMatchMBS( const unsigned TCHAR *Ptn, const unsigned TCHAR *Str ){ としたところ、

エラー4error C2050: switch 式の結果は、整数値になりませんでした。

エラー3error C2065: 'Ptn' : 定義されていない識別子です。

・・・のエラーがでます。

_________________________________________________________________________________________________

int KeywordDlg::StrMatchMBS( const TCHAR *Ptn, const TCHAR *Str ){ としたところ

Ptn と Str の所で、赤い波線となり、

エラー2error C2664: '_mbsinc' : 1 番目の引数を 'const TCHAR *' から 'const unsigned char *' に変換できません。(新しい機能 ; ヘルプを参照)

_________________________________________________________________________________________________


↓この方の質問のままなのですが、具体的に どう書けばいいのか?分かりません。
◆UNICODE化のための書き換え
http://oshiete.goo.ne.jp/qa/6966243.html

_tcsrchr もどこで使えばいいのか分かりません。

ポインターの記述を完全に理解していないせいで、分からないのでしょうか?

すみませんが、もう少し、補足して頂くとうれしいですm(_ _)m

A 回答 (2件)

PtnとStrの型を変更したのだから、それを引数として渡している関数についても、変更が必要になるのは当然のことです。


例えば、_mbsincはconst unsigned char*を引数にとるので、これをTCHARに対応したものに置き換える必要があります。
MSDNで調べると、_tcsincという関数が用意されていることがわかります。

_mbsinc、_mbsinc_l、_strinc、_wcsinc
http://msdn.microsoft.com/ja-jp/library/ex0hs2ad …

他の関数も、同様にTCHAR対応のものに置き換えてください。

また、'\0'といった表現もTCHAR対応する必要があります。_T('\0')のように。

この回答への補足

ありがとうございます!うまく動いているようです。
しかし、何かおかしな所があれば、教えてくださいm(_ _)m

実際に、目的の機能をコーディングするので、締め切るのはもう少しかかります。ご了承ください。

これからは「関数リファレンス」などMSDNを使って、自分で作れるようになりたいです。


int KeywordDlg::StrMatchMBS( const TCHAR *Ptn, const TCHAR *Str ){

  //const char *Ptn …ワイルドカード付き文字列
  //const char *Str …検索対象
  //戻り値 …1/0:真/偽

  //_mbsinc()を_tcsinc()に _mbsnextc()を_tcsnextc()に、変更 2011.09.09

  switch( *Ptn )
  {
    case _T('\0'):
      return (_tcsnextc(Str)==_T('\0'));
    case _T('*'):
      return StrMatchMBS( _tcsinc(Ptn), Str ) || (_tcsnextc(Str)!=_T('\0')) && StrMatchMBS( Ptn, _tcsinc(Str) );
    case _T('?'):
      return (_tcsnextc(Str)!=_T('\0')) && StrMatchMBS( _tcsinc(Ptn), _tcsinc(Str) );
    default:
      return (_tcsnextc(Ptn)==_tcsnextc(Str)) && StrMatchMBS( _tcsinc(Ptn), _tcsinc(Str) );
  }
}
//}

BOOL KeywordDlg::keywords_Match(CString targetStr,CString in_Str){
  if( in_Str == ""){
    return TRUE;
  }

  BOOL tempFLG = FALSE;

  CString str_1 = targetStr;
  CString str_2 = in_Str;
  

  int sizeOfString_1 = (str_1.GetLength() + 1);
  LPTSTR lpsz_1 = new TCHAR[ sizeOfString_1 ];
  _tcscpy_s(lpsz_1, sizeOfString_1, str_1);

  int sizeOfString_2 = (str_2.GetLength() + 1);
  LPTSTR lpsz_2 = new TCHAR[ sizeOfString_2 ];
  _tcscpy_s(lpsz_2, sizeOfString_2, str_2);

  //tempFLG = StrMatchMBS(str_1,str_2);//←こちらでも動くようですが、なんとなく気持ちが悪いので、型を合わせました。(↓)。無意味でしょうか・・・?

  tempFLG = StrMatchMBS(lpsz_1,lpsz_2);


  delete[] lpsz_1;
  delete[] lpsz_2;

  if( tempFLG == TRUE ){
    return TRUE;
  }else{
    return FALSE;
  }
}

補足日時:2011/09/09 11:24
    • good
    • 0
この回答へのお礼

素早い的確な ご回答、ありがとうございました。
教えていただき 目的の機能を実現できました!

お礼日時:2011/09/10 05:37

const TCHAR*の引数にCStringを渡す場合のことですね。


const TCHAR*はLPCTSTRと同じです。
CStringにはoperator LPCTSTRが定義されているので、LPCTSTRとして使用すると自動的にoperator LPCTSTRによって変換した結果が渡されます。

この回答への補足

回答ありがとうございました。

そこまで、考えてなかったですυ
CString を TCHAR に 変える時に使う程度の 知識しか持ち合わせていませんでした。

operator という言葉 も初めて聞きました。。。
勉強になりますm(_ _)m

便利に出来てるんですね。

補足日時:2011/09/09 13:03
    • good
    • 0

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