大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

C++でC風ライブラリを作る(文字列比較編)

著者:高木信尚
公開日:2019/07/19
最終更新日:2019/07/19
カテゴリー:技術情報

高木です。こんばんは。

しばらくこの連載も止まっていましたが、今回から再開したいと思います。
今後の投稿頻度はやや少なくなっていくとは思いますけど。

前回は文字列のコピーを扱いました。
その関連ということで、今回は文字列の比較を扱うことにします。

Cの標準ライブラリには、文字列を扱う関数は(ワイド文字列版を除けば)2種類あります。
さらに、比較対象の文字数を制限した関数もありますので、都合3つになります。
具体的には、strcmpstrcoll、そしてstrncmp関数です。

Cでプログラミングした経験があれば、strcmp関数を使ったことがない方は稀だと思います。
この関数は、2つのナル終端文字列を単純比較するもので、文字列中の各文字をunsigned char型として順に比べていきます。
unsigned char型として比較するのは、char型が符合付きか符合無しかは処理系定義だからです。
strcmp関数は、第1引数で指定した文字列の方が大きければ正の値を、小さければ負の値を、一致すればゼロを返します。

strncmp関数はstrcmp関数の対象文字数を制限するものです。
文字列がまだ続いていても、指定した文字数に達したらそこで処理を中断し、それまでの比較結果を採用します。

最後のひとつstrcoll関数を使ったことがあるという方はほとんどいないのではないでしょうか?
この関数は文字列を(単純比較ではなく)辞書順に比較します。
比較方法はカテゴリLC_COLLATEのロケールに依存します。
もうこの時点でチンプンカンプンの方もいるかと思います。

例えば、英語では大文字小文字が違っても辞書順としては同じになります。
その他のヨーロッパ語ではアクセント符号やトレマなどが付いても辞書順が同じになるケースがあります。
日本語ではひらがなでもカタカナでも辞書順は同じですね。
辞書順が同じでも異なる文字列は異なる結果になるのですが、まずは辞書順で比較して、そのあとで辞書順以外の要素を比較することになります。

はっきりいってstrcoll関数を実装するのはかなり面倒です。
その割には使用機会がほとんどありません。
そんな事情から、今回はstrcoll関数相当のものは割愛し、単純比較を行う関数だけを作っていくことにします。

前置きだけでほとんど1,000字に達してしまいましたね。
このまま強引にソースコードを貼ってもいいのですが、お楽しみは次回にとっておくことにしましょう。
次回の投稿はなるべく早めに行うようにします。

    上に戻る