您显然正在尝试使用的技术表明您需要vsprintf
(或更好,vsnprintf
)
va_list argptr;
va_start(argptr, format);
vsnprintf(buffer, sizeof buffer, format, argptr);
va_end(argptr);
这就是此类功能的原因v...
组存在于标准库中。
Calling sprintf
你这样做的方式根本没有意义 - 它不能与外部提供的一起使用va_list
.
如果你想实现一个可变大小的缓冲区,你可以这样做
void foo(const char* format, ...)
{
static char *buffer;
static size_t buffer_size;
va_list argptr;
va_start(argptr, format);
int length = vsnprintf(buffer, buffer_size, format, argptr);
va_end(argptr);
if (length + 1 > buffer_size)
{
buffer_size = length + 1;
buffer = realloc(buffer, buffer_size);
/* Yes, `realloc` should be done differently to properly handle
possible failures. But that's beside the point in this context */
va_start(argptr, format);
vsnprintf(buffer, buffer_size, format, argptr);
va_end(argptr);
}
printf("%s.\n", buffer);
}
当然,您可以将内存管理策略更改为不同的策略,例如使用固定的本地缓冲区512
第一次调用中的字节,然后仅在第二次调用中使用临时动态分配的缓冲区512
事实证明是不够的。等等...