FindSS。
ファイルから文字列を検索するっていう機能はある程度実装したので脇に置いといて、文字列から文字列を検索する機能をレベルアップさせてます。文字列から文字列を検索することがこんなに大変だったなんて思わなかった。「I」って検索するとたまに関係ない文字列が引っかかって、すぐに「マルチバイト文字の先頭バイトだか後尾バイトの文字コードが反応してやがる」ことは分かったんですけど、どうしたもんか。ということで、IsDBCSLeadByte()関数でマルチバイト文字の先頭バイトか判定しながら検索しております。文字列の検索アルゴリズムの話。文字列の検索アルゴリズムってのはすごくシンプルで、ちょっと効率が悪いけど、1バイト目からNULL文字までひたすら検査するなんてアルゴリズムでも構わない。と、思う。検索対象文字列"AIUEOKAKIKUKEKO"検索文字列"IKU"上のような関係の検索をする場合。太い字は現在検査している文字。下線のある字は一致している文字。"AIUEOKAKIKUKEKO""IKU"一致しないので対象の文字列の検査する位置だけを1バイト進める。"AIUEOKAKIKUKEKO""IKU"一致した場合、検査する位置を両方とも1バイト進める。"AIUEOKAKIKUKEKO""IKU"一致しないので対象の文字列の検査する位置だけを1バイト進めて、検索する文字列の検査する位置を0に戻す。これを繰り返すと以下のようになる。"AIUEOKAKIKUKEKO""IKU""AIUEOKAKIKUKEKO""IKU""AIUEOKAKIKUKEKO""IKU""AIUEOKAKIKUKEKO""IKU""AIUEOKAKIKUKEKO""IKU""AIUEOKAKIKUKEKO""IKU""AIUEOKAKIKUKEKO""IKU""AIUEOKAKIKUKEKO""IKU"検索文字列の検査が終端に着いたので検索終了。これでも構わないけど、ほんの少し効率をよくするとなると、対象の文字列のNULL文字まで検索しなければいい。検索対象文字列"123456789"検索文字列"987"上のような関係の検索をする場合。対象の文字列のバイト数から検索する文字列のバイト数引いた数に 1 足した数だけ検査するといい。※基本的な検査の回数であり、一致するならどんどん検査していかなくてはいけない。"123456789" - "987" + 1 = 7バイト"123456789""987""123456789""987""123456789""987""123456789""987""123456789""987""123456789""987""123456789""987"7バイトで検索は終了。ここで一致しないなら一致することはないからだ。結構ショボいけど、検索する文字列が長ければ長いほど効率は上がる、と思う。さらに効率アップを図りたい場合。ある程度一致したのに結果が一致していない場合、検査する位置を1バイト進めても一致しない。だから、ある程度一致しても結果が一致していないなら n バイト進めてしまう。検査する位置。検索対象文字列"TOTTOTOTOIRENIITTOIRE!"検索文字列"TOIRE!""TOTTOTOTOIRENIITTOIRE!" - "TOIRE!" + 1 = 17バイト"TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TO"までは一致しているので、検査する位置を1バイトではなく2バイト進める。"TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!"一文字しか一致しなかった場合、検査する位置を1バイトだけ進める。そうしていくと以下のようになる。"TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!""TOTTOTOTOIRENIITTOIRE!""TOIRE!"検索文字列の検査する位置が終端に着いたので検索終了。あー疲れた。自分に対しての情報なので他人には分かり辛いかもしれません。コードも載せてませんし。こういうのって概念というか考え方は理解できても、実際にコードにするってのは難しいんですよねぇ。