WIN環境のMinGWとsnprintf
とりあえず、snprintf()を使うとMinGWのライブラリから静的リンクされる(ファイルが太る)。
んで、戻り値がC99に適ってない気がする( gcc 3.4.5-3(1のcc1)、rt 3.15.2、win32api 3.13 )。
char dst[10];
char src[] = 10byteの文字列;
として、
i = snprintf(dst, 10, "123%s", src); とした時 、
i に-1が戻らず、無制限の場合に書き込まれるはずだったbyte数(今回は13)が返る。
一応、オーバーラン自体はしていない模様。
で、_snprintf()。 MSVCRTへの動的リンクになる(ファイルは太らない)。
これで上記を行うとちゃんと-1が戻る。
どちらにしろ、バッファの終端をNULLで埋める必要からバッファサイズを知っていないといけない訳だけれど、その必要の有無を戻り値と(例では10と)比較して決める必要があるのはよろしくない('з`)
確か、snprintf()は%pや%x等でsprintf(MSVCRT?)と違う挙動をしてた気もする。
そんな感じで、素直にMSVCRTの_snprintf()を使う方が良さげ、という話し('з`)
んで、戻り値がC99に適ってない気がする( gcc 3.4.5-3(1のcc1)、rt 3.15.2、win32api 3.13 )。
char dst[10];
char src[] = 10byteの文字列;
として、
i = snprintf(dst, 10, "123%s", src); とした時 、
i に-1が戻らず、無制限の場合に書き込まれるはずだったbyte数(今回は13)が返る。
一応、オーバーラン自体はしていない模様。
で、_snprintf()。 MSVCRTへの動的リンクになる(ファイルは太らない)。
これで上記を行うとちゃんと-1が戻る。
どちらにしろ、バッファの終端をNULLで埋める必要からバッファサイズを知っていないといけない訳だけれど、その必要の有無を戻り値と(例では10と)比較して決める必要があるのはよろしくない('з`)
確か、snprintf()は%pや%x等でsprintf(MSVCRT?)と違う挙動をしてた気もする。
そんな感じで、素直にMSVCRTの_snprintf()を使う方が良さげ、という話し('з`)
この記事へのコメント