2016-01-27 9 views

答えて

8

はい。 7.21.6.5 snprintfの関数から

、N1570(C11ドラフト):

snprintfの関数は出力 は(引数Sによって特異的ED)アレイに書き込まれることを除いて、関数fprintfと等価です ストリームではなく、 nが0の場合、何も書き込まれず、sはNULL ポインタです。それ以外の場合、n-1stを超える出力文字は配列に書き込まれるのではなく、 が破棄され、実際に 配列に書き込まれた文字の末尾にNULL文字 が書き込まれます。オーバーラップするオブジェクト間でコピーが行われる場合、 の動作は未定義です。

それはあなたが最初に必要な長さを発見して、メモリの正確な量を割り当てることができたため、未知のデータの長さを見つけるための有用な方法です。典型的な使用例は次のとおりです。

char *p; 

int len = snprintf(0, 0, "%s %s some_long_string_here_", str1, str2); 

p = malloc(len + 1); 

snprintf(p, len + 1, "%s %s some_long_string_here", str1, str2); 
+0

良いですが、正確に引用していますか? –

+0

[C11ドラフト](http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf)、セクション7.21.6.5。 – nouney

2

snprintf(3)によれば、POSIX &によってC99によって標準化されています。そのmanページにも書かれています:

Concerning the return value of snprintf(), SUSv2 and C99 contradict 
    each other: when snprintf() is called with size=0 then SUSv2 
    stipulates an unspecified return value less than 1, while C99 allows 
    str to be NULL in this case, and gives the return value (as always) 
    as the number of characters that would have been written in case the 
    output string has been large enough. POSIX.1-2001 and later align 
    their specification of snprintf() with C99. 

のでint i=snprintf(NULL, 0, "いくつかの形式の文字列", .... );iに失敗した場合は負の数、または上の非負の出力サイズを置く必要があります成功。

(私は正確に出力サイズは非常に珍しい大きいほどよりINT_MAXであれば何が起こるか分からない。私はそれが失敗する場合があることだろうと推測する)

関連する問題