snprintf
POSIX または C99 をサポートするプラットフォームを使用している場合は、 を使用して、必要なバッファーのサイズを計算できるはずです。snprintf
渡すバッファのサイズを示すパラメータを取ります。文字列のサイズがそのバッファーのサイズを超える場合、バッファーに収まるように出力を切り捨て、出力全体を収めるのに必要なスペースの量を返します。この出力を使用して、正確なサイズのバッファーを割り当てることができます。必要なバッファーのサイズを計算するだけの場合は、バッファーとして NULL を渡し、サイズ 0 を渡して、必要なスペースの量を計算できます。
int size = snprintf(NULL, 0, "%.20g", x);
char *buf = malloc(size + 1); // Need the + 1 for a terminating null character
snprintf(buf, size + 1, "%.20g", x);
free(buf)
メモリリークを避けるために、使用後は忘れないでください。
これの問題は、C99 をまだサポートしていない Visual Studio では機能しないことです。のようなものsnprintf
がありますが、渡されたバッファが小さすぎると、必要なサイズが返さ-1
れず、代わりに返されますが、これはまったく役に立ちません(長さNULL
があってもバッファとして受け入れられません0
)。
切り捨てを気にしない場合はsnprintf
、固定サイズのバッファーを使用するだけで、オーバーフローしないことが保証されます。
char buf[30];
snprintf(buf, sizeof(buf), "%.20g", x);
プラットフォームのドキュメントを確認してくださいsnprintf
。特に、一部のプラットフォームでは、文字列が切り捨てられた場合に文字列の末尾に終端の null を追加しない場合があるため、自分で行う必要がある場合があります。