バグ:文字列から数値に変換
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まで指定可能です。
それ以上の場合は、独自実装が必要
コメント