アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2015年04月13日

今更知った文字列比較の落とし穴

先日、自前のISAMシステムを開発していたのだが、インデックス構築側(仮にサーバサイド)では見つかるのに、検索側(仮にクライアントサイド)では見つからないという奇妙な現象が発生した
よくよくしらべてみると、サーバサイドではソートの際にキーの比較に strcmp を使用しているのに対し、クライアントサイドでは stricmp を使用しているのに気が付いた
元々のインデックスはすべて大文字変換してから格納してあったので、両者に違いはないと思いこんでいたのだが、実はここが大きな落とし穴で、stricmp のMSDNでの仕様は、小文字に変換してから比較するという記述があったのだ
そこでは、サンプルとしてアンダースコア '_' を含む文字列比較が、 strcmp と stricmp とで異なる結果を返すという解説も記述してあった
そこで、クライアントサイド側でデバッグしてみると、確かに、 '_' を含むデータの個所で、インデックス判定が逆転するということがわかった(検索では bsearch_s API を利用していたので、大小が逆転すると見つからなくなってしまう)

以前の記憶(おそらくVC6時代)では、stricmp は大文字変換してから比較していると思いこんでいたので、今回も、あえてインデックスは大文字変換してから格納していたのだが、それが裏目に出た格好だ

これについては、クライアントサイドのコードを修正し、キーとターゲットを両方大文字に変換してから strcmp を使うことで正しい結果を得ることができた

いや〜、長年の思い込みは怖いですね





ファン
検索
<< 2015年04月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
最新記事
最新コメント
タグクラウド
カテゴリアーカイブ
プロフィール
いしちゃんさんの画像
いしちゃん
ブログ
プロフィール
日別アーカイブ
×

この広告は30日以上新しい記事の更新がないブログに表示されております。