我需要*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
那么容易。
答案 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
}