バグ:文字列中の文字を正しく判断するためには

Posted: 2013年07月08日

文字の種類を判断するプログラムで書いてしまうバグを紹介します。

プログラムプログラム:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    char cSrc = 'a';

    // 入力要求
    if (isascii(cSrc) == 0) {
        return;
    }

    // 処理

    return 0;
 }

このプログラムにどのように文字の種類を判断する処理にバグが存在すると思いますか?

  • isasciiでは、名前の通りasciiで定義された文字のみしか判断できない、平仮名などは何が変えられるかそれぞれとなる

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

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    char *szSrc = "a";

    if szSrc == NULL) {
        return;
    }
    int nRet = _mbsbtype(szSrc);
    if (nRet != 0) {
        // アルファベット以外の文字
        return;
    }

    // 処理

    return 0;
 }

解説解説:

状況にもよりますが
今回は、アルファベットのみではなく他の文字も含まれる文字列の場合について書いています。

_mbsbtypeを用いると

  • 1byte文字 (アルファベット)
  • 2byte文字 (日本語等)
  • 無効文字

が検知できます。

改善版では、アルファベットを探すため
アルファベットを表す0 以外は無視するようにしています。

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

コメント