
こんにちは。
いつもお世話になっております。
CStringのFindメソッドで文字列検索を行っているのですが、文字列ではなくコードで検索が行われてしまい困っています。
-------------------------------------------------------
CString TargetStr;
TargetStr = "ハヒフヘホ";
if(TargetStr.Find("z", 1) != -1){
return FALSE;
}
-------------------------------------------------------
上記で文字"ホ"のコードが「837A」で"z"が「7A」のため、
文字列が存在するという結果が帰ってきます。
コードではなく文字そのものの検索をするにはどうしたらよいでしょうか?
基本的なことで申し訳ありませんが、ご教示下さい。
<環境>
Windows 2000, VC6.0
No.4ベストアンサー
- 回答日時:
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 …
circuitさん、コメントありがとうございます。
返事遅くなり申し訳ありません。
_mbsstrを使用する方向で行きたいと思いますがつまづいています。
また機会があればご教示下さい。
No.5
- 回答日時:
#4です。
> *注意*
> この関数はANSIに互換性がないようですので、Windows以外では利用できない可能性があります。
を以下のように訂正。
*注意*
この関数はANSIに互換性がないようですので、VC以外では利用できない可能性があります。
VC6.0はもっていないのでわかりませんが、
VS.NET2005及びBorlandC++Complierにて動作を確認しました。
No.3
- 回答日時:
#2です。
ミスがあったので訂正します。CStringW TargetStrW = L"ハヒフヘホ";
if(TargetStrW.Find(L"z",+)!=-1){
return FALSE;
}
No.2
- 回答日時:
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
sha-girlさん、コメントありがとうございます。
返事遅くなり申し訳ありません。
残念ながら、VC6でCStringWは使用できませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
先着1,000名様に1,000円分もらえる!
教えて!gooから感謝をこめて電子書籍1,000円分プレゼント
-
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
VC++で文字列から任意の文字を削除するにはどうしたらいいですか?
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
4
画面を強制的に再描画させる方法
C言語・C++・C#
-
5
CString から LPCTSTRの型に変換
C言語・C++・C#
-
6
C++で文字列の右端から特定の文字までの文字列を
C言語・C++・C#
-
7
文字列の置換をCStringで(C++)
C言語・C++・C#
-
8
CString型 全角半角を意識せずに「1文字」ずつ取り出す
C言語・C++・C#
-
9
CString型の文字列連結について
C言語・C++・C#
-
10
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
11
ファイルやディレクトリの存在確認を行う方法
C言語・C++・C#
-
12
Debug Assertion Failed?
C言語・C++・C#
-
13
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
14
コンボボックス表示文字列を取得する場合
C言語・C++・C#
-
15
コンボボックスのドロップダウンリストが表示されない
C言語・C++・C#
-
16
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
17
C++で指定文字列のカウント方法(テキストマイニング)
C言語・C++・C#
-
18
コンボボックスの値がうまく取得出来ません。
C言語・C++・C#
-
19
エディットボックスの入力制限について
C言語・C++・C#
-
20
MFC ダイアログ上のID取得について
C言語・C++・C#
関連するQ&A
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
C言語で16進数文字列から16進数...
-
5
文字列中に含まれる文字の個数...
-
6
fgetsで拾われる改行文字を削除...
-
7
作ったプログラミングC何だけど...
-
8
putsとputcharの違い?
-
9
CStringについて
-
10
Cで「大文字、小文字の判定」は...
-
11
単語数のカウントについて
-
12
反転した数値を表示させるやり方
-
13
文字列→数値変換関数
-
14
大学のプログラミング課題について
-
15
ある文字列で2回目3回目に出現...
-
16
データ数値を16進文字列でprint...
-
17
C言語で可変長から固定長に変換...
-
18
アルファベットから航空用アル...
-
19
if文の判定条件('||'と'&&'の使...
-
20
itoaわかりません
おすすめ情報