获取* printf函数系列的目标长度

时间:2013-04-15 21:38:04

标签: c malloc printf

我需要*printf函数中需要多少个字符的目标长度。我的场景是一个应该最终创建一个字符串的日志记录工具(它发生的事情是无关紧要的,它必须以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
}

这就像一个魅力,但它似乎过于复杂。有没有更简单的方法?更有意义的东西。

其他细节:我最后进一步格式化字符串并将其转储到OpenSSL BIO中,因此它不像使用vfprinf那么容易。

2 个答案:

答案 0 :(得分:3)

理智且合理的简化是使用vsnprintf()而不是vfprintf(),因为您只需要NULL指针和缓冲区大小为零,而不是文件。更优雅一点。 (别担心,在C语言中调用两次函数是一个常见的习惯用法:第一次为了弄清缓冲区长度,第二次实际完成工作。)

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, ...)

真。

答案 1 :(得分: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
}