2

sprintf( ) が必要とするスペースを予測するために使用できる関数はどこかにありますか? IOW、関数 size_t predict_space( "%s\n", some_string ) を呼び出して、sprintf( "%s\n", some_string ) から得られる C 文字列の長さを返すことはできますか?

4

4 に答える 4

9

C99 (注: Windows および SUSv2ではsnprintf 、標準に準拠した snprintf (または _snprintf) の実装を提供しないでください) :

       7.19.6.5 snprintf 関数

       あらすじ

       [#1]

               #include <stdio.h>
               int snprintf(char * restrict s, size_t n,
                       const char * 形式を制限する ...);

       説明

       [#2] snprintf 関数は fprintf と同等ですが、次の点が異なります。
       出力が配列に書き込まれること (によって指定される)
       引数 s) ではなく、ストリームに。n が 0 の場合は何もない
       と書かれており、s は null ポインタの可能性があります。それ以外の場合、出力
       n-1 番目を超える文字は、破棄されるのではなく破棄されます。
       配列に書き込まれ、ヌル文字が配列に書き込まれます
       配列に実際に書き込まれた文字の末尾。もしも
       重複するオブジェクト間でコピーが行われ、
       動作は未定義です。

       戻り値

       [#3] snprintf関数は文字数を返す
       nが十分に大きかったら書かれたであろう、
       終端のヌル文字、または負の数を数えない
       エンコード エラーが発生した場合の値。したがって、null-
       終了した出力が完全に書き込まれたのは、次の場合のみです。
       戻り値は負ではなく、n 未満です。

例えば:

len = snprintf(NULL, 0, "%s\n", some_string);
if (len > 0) {
    newstring = malloc(len + 1);
    if (newstring) {
        snprintf(newstring, len + 1, "%s\n", some_string);
    }
}
于 2011-03-17T11:40:48.130 に答える
6

サイズが 0 の snprintf() を使用して、必要なバイト数を正確に調べることができます。その代償は、文字列が実質的に 2 回フォーマットされることです。

于 2011-03-17T11:38:49.850 に答える
2

snprintf次のように、そのために使用できます

sz = snprintf (NULL, 0, fmt, arg0, arg1, ...);

ただし、Autoconf の移植性に関する注意事項を参照してくださいsnprintf

于 2011-03-17T11:41:18.667 に答える
2

ほとんどの場合、連結する文字列の長さを追加し、使用した形式に基づいて数値の最大長を取得することで計算できます。

于 2011-03-17T11:43:58.427 に答える