バグ:文字列から数値に変換

Posted: 2013年04月01日

文字列操作(文字列から数値に変換)で気が付かずに書いてしまうバグを紹介します。
前も似たようなことは書いた気もしますが
2度書いても、忘れてしまうことなため!!

プログラムプログラム:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    CString strNumber;

    strNumber.Format(_T("%3d"), 100);
    int nNum = _tcstol(strNumber);

    // 処理

    return 0;
 }

このプログラムにどのように文字列操作(文字列から数値に変換)にバグが存在すると思いますか?

  • 10進数のつもりで変換しているが、%3dで左に0埋めを行うため、8進数で処理がされる

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

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    CString strNumber;

    strNumber.Format(_T("%3d"), 100);
    int nNum = _tcstol(strNumber, 10);

    // 処理

    return 0;
 }

解説解説:

_tcstolでは、第二引数に進数の指定が可能なため
10進数の10を指定します。

指定しない場合は、

進数 サンプル 設定内容
8進数 0100 数値の先頭に0を付与
10進数 1000
16進数 0x10 数値の先頭に0xを付与

第二引数は2〜32まで指定可能です。
それ以上の場合は、独自実装が必要

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

コメント