バグ:文字列(ロケール)の比較で予想外の動作となる

Posted: 2013年08月26日

文字列の比較ににより問題となる処理を紹介します。
今回はロケールを考慮した比較を対象としています。

プログラムプログラム:

 #include <stdio.h>
 #include <stdlib.h>

 int main(int argc, char *argv[])
 {
    char *pszSrc = "aaa";

    if (0 < strcmp(pszSrc, "AAA")) {
        // 処理

    }

    return 0;
 }

このプログラムにどのように文字列の比較に問題が存在すると思いますか?

  • 「aaa」が大きいはずがstrcmpでは小さいと判定される

fcvt

改善版プログラム改善版プログラム:

 #include <stdio.h>
 #include <stdlib.h>

 int main(int argc, char *argv[])
 {
    char *pszSrc = "aaa";

    if (0 < strcoll(pszSrc, "AAA")) {
        // 処理

    }

    return 0;
 }

解説解説:

strcollでは、現在のロケール情報(LC_COLLATE)
を用いて比較を行うため

結果は、strcmpとは異なります。

strcmp 「ABCDabcd」
strcoll 「aAbBcCdD」

ロケール設定によってstrcollの結果が異なるため
すべての環境がstrcmpと異なるとは言えません。

あまりロケールを考慮した処理を
C言語で実装することがないため
私は経験がないためマイナーな位置づけですが

実際に使用すべき状況に置かれた場合は、
独自実装してしまいそうなため知っていて損はありません。

カテゴリー: バグ, プログラム | タグ: , , | コメント無し »

コメント