1

関数に必要な文字数の目標の長さが必要*printfです。私のシナリオは、最終的に文字列を作成する必要があるログ機能です (何が起こるかは関係ありません。末尾は a である必要がありますchar *)。

私は現在これを持っています:

void log(char *format, ...)
{
    char *full_message, *message;
    FILE *nullfile;
    va_list args;

    va_start(args, format);
    nullfile = fopen("/dev/null", "w");
    message_len = vfprintf(nullfile, format, args) + 1;
    fclose(nullfile);
    va_end(args);

    va_start(args, format);
    message = malloc(message_len);
    vsnprintf(message, message_len, format, args);
    va_end(args);

    // now do something with the final message
}

それは魅力のように機能しますが、あまりにも複雑に思えます。もっと簡単な方法はありますか?もっと理にかなっている何か。

追加の詳細: 最後に、文字列をさらにフォーマットして OpenSSLBIOにダンプするため、 を使用するほど簡単ではありませんvfprinf

4

2 に答える 2

3

ファイルの代わりにポインタとゼロのバッファサイズが必要なだけなので、健全で合理的​​な単純化はvsnprintf()の代わりに使用することです。ややエレガント。(心配しないでください。C では、これらのような関数を 2 回呼び出すのが一般的なイディオムです。1 回目はバッファー長を計算するためで、2 回目は実際にジョブを完了するためです。)vfprintf()NULL

va_start(args, format);
int message_len = vsnprintf(NULL, 0, format, args) + 1;
va_end(args);

ああ、そして...

void log(char *format, ...)

する必要があります

void log(const char *format, ...)

本当。

于 2013-04-15T21:43:29.720 に答える
2

これがsnprintfの目的です:

void log(char *format, ...)
{
    char *message;
    va_list args;

    va_start(args, format);
    message_len = vsnprintf(0, 0, format, args) + 1;
    va_end(args);

    va_start(args, format);
    message = malloc(message_len);
    vsnprintf(message, message_len, format, args);
    va_end(args);

    // now do something with the final message
}
于 2013-04-15T21:45:30.887 に答える