これらの、セキュリティ強化バージョンが_ecvt_s, _fcvt_s関数です。
VS2005以降でないと使えません。
errno_t _ecvt_s( char * _Buffer, size_t _SizeInBytes, double _Value, int _Count, int *_Dec, int *_Sign );_Bufferは結果を格納するバッファです。
_SizeInBytesは、バッファサイズ(バイト)です。
_Valueは、変換される数値です。
_Countは、格納する桁数です。
_Decは、小数点の位置を格納する変数のアドレスです。小数点が先頭から何文字目に有るかを示します。
_Signは、プラス、マイナスを表す符号を格納する変数へのポインタです。正の数の場合は0、そうでないときは負を表します。
では、簡単なサンプルを見てみましょう。
/* ecvt01.c */ #include <stdio.h> #include <stdlib.h> int main() { double d1 = -10.25613, d2 = 0.058; char buf[16]; int dec, sign; _ecvt_s(buf, sizeof(buf), d1, 12, &dec, &sign); printf("%s dec= %d, sign = %d\n", buf, dec, sign); _ecvt_s(buf, sizeof(buf), d2, 12, &dec, &sign); printf("%s dec= %d, sign = %d\n", buf, dec, sign); return 0; }実行結果は次のようになります。
次は、_fcvt_s関数ですが、次のように定義されています。
errno_t _fcvt_s( char* buffer, size_t sizeInBytes, double value, int count, int *dec, int *sign );ほとんど_ecvt_s関数と同じです。どこが違うかというと、countが小数点以下の桁数を指定する点です。
では、サンプルのプログラムを見てみましょう。
/* fcvt01.c */ #include実行結果は次のようになります。#include int main() { double f1 = -1.23456789, f2 = 123.45; char buf[16]; int dec, sign; _fcvt_s(buf, sizeof(buf), f1, 1, &dec, &sign); printf("%s dec = %d, sign = %d\n", buf, dec, sign); _fcvt_s(buf, sizeof(buf), f2, 4, &dec, &sign); printf("%s dec = %d, sign = %d\n", buf, dec, sign); return 0; }
特に、面倒なことはないですね。
Update Sep/12/2007 By Y.Kumei