バグ:文字列の長さを取得

Posted: 2012年12月17日

文字列から長さを取得する処理でよく書いてしまうバグを紹介します。
実際に最近私がやってしまったバグでも有ります。
わかっていても〜やってしまう・・・
前も同様の内容を記述して記憶はありますが
重要なのでもう一度

プログラムプログラム:

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

 int main(int argc, char *argv[])
 {
    CString strSrc = _T("1234567890");
    const int nLength = strSrc.GetLength();

    // 処理
    printf(_T("%d文字"), nLength);

    return 0;
 }

このプログラムにどのような文字列の長さ取得処理のバグがあると思いますか?

  • 通常の場合CStringAはバイト数を返すため、2バイト文字(日本語等)が含まれる場合は、文字数ではなくなる。
     ※マルチバイドコードの場合のみ

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

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

 int main(int argc, char *argv[])
 {
    CString strSrc = _T("1234567890");
    size_t nLength = _mbstrlen((LPTCSTR) strSrc);

    // 処理
    printf(_T("%d文字"), nLength);

    return 0;
 }

解説解説:

_mbstrlenを用いることでマルチバイトコードの文字数を計算してくれます。

ほかは、変更はありません。
プリプロセッサー「_MBCS」を付加しても
CStringは、2バイト文字を1文字と認識してくれないようで
他にも色々と嵌りそう
もしかしたら、STLのstringなら普通に使えるのかな?

調べてみたけど、そこまで便利なクラスではなかったようで
今時は、unicodeで作成するべきだろうし
そうしたほうが将来性もあるんだろうね

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

コメント