open-mgl-dev (開発バージョン) (0.7.9.80) | 2009-11-02 22:25 |
open-mgl (DirectX9, VC++2008) (0.7.9) | 2009-09-27 20:32 |
roast-dev (開発バージョン) (0.0.1.40-dev) | 2009-11-02 23:09 |
>FrontPage>Roast+>リファレンス>std>safe.hpp>roast_snprintf
文字列バッファ str に対し、size にて指定されたメモリサイズを超えない範囲内で sprintf() 標準関数と同様の動作を行います。
処理の結果 size の範囲を超える場合、それらの文字列は切り捨てられます。また、切り捨てられたかどうかを検知する事はできません。
(唯一、destに格納された文字列の長さ──strlen()の復帰値──が dest_memsize - 1 の値であるかどうかにより、切り捨てられたかもしれない事を検知出来ます。)
切り捨てられたかどうかを検知するには roast_snprintf_ex() を使用する必要があります。(※この機能は現時点ではまだ実装されていない)
str に格納される文字列の終端は必ず '\0' である事が保障されます。このため、str に格納される('\0'を除く)文字列の最大長は size - 1 となります。
roast/std/safe.hpp :
roast_bufsafe.h :
初期版数からサポート。
多くのコンパイラや、UNIX系OSであれば同様の動作を行う関数 snprintf が存在します。
しかし、Microsoft Visual C++にはこの関数が存在しません。その代わりに、_snprintf() と言う関数が存在しますが、これはUNIX系OSでの snprintf とは動作の異なるものであり、
strncpy() 等のように、文字列の最後が '\0' で終了するとは限らない仕様となっています。
この仕様の差異は、UNIX系OSからWindows OS、ないしその逆へ移植作業を行う場合、単なる関数置き換えでは済まず、多くのプロジェクトでは莫大な手間となり、
また、修正箇所が多い事による思わぬバグの埋め込みが発生する可能性もあります。
本関数を予め使用していれば、このような問題を回避できます。UNIX系OSからWindows OS、ないしその逆へと移植を行うとしても、
snprintf, _snprintf 関数仕様箇所における必要は一切ありません。もし、あなたのプロジェクトのソースが、今後他OSへの移植の可能性がある場合、
また、その可能性が現段階では見えていないとしても、可能であれば本関数を使用するようにすべきです。