バグ:文字列(数値)の比較で予想外の動作となる

Posted: 2013年08月19日

文字列の比較ににより問題となる処理を紹介します。

プログラムプログラム:

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

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

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

    }

    return 0;
 }

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

  • 文字列の比較のため「234」が大きいと判定される

fcvt

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

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

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

    int nSrc = atoi(pszSrc);

    if (nSrc < 234) {
        // 処理

    }

    return 0;
 }

解説解説:

strcmpでは、文字の比較のため

1234 < 234

となるこれは、
1文字目が「1」よりも「2」が大きいためです。

数値として比較したい場合は、文字列を数値に変換して比較する必要があります。

strcmpは、バイナリーで比較するため
a < A
となりますが

あくまでASCII文字の場合

他の文字コードの場合はその文字コードの並びによりこの結果が変わります。

大小区別せずに比較する場合は、
比較元の文字を大文字か小文字に変換後

strcmpを行うことで
比較ができます。

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

コメント