Hat*_*end 1 c variadic-functions
我有一个功能;
void foo(const char* format, ...)
{
char buffer[1080];
// Supposed way to handle C Variable Arguments?
va_list argptr;
va_start(argptr, format);
sprintf(buffer, format, argptr);
va_end(argptr);
printf_s("%s.\n", buffer);
}
int main()
{
int val = 53;
foo("%d", val);
}
Run Code Online (Sandbox Code Playgroud)
每次运行时,我都会得到每次运行时都会发生变化的大量数字.12253360, 5306452等我不明白为什么.
这是我的sprintf电话,还是我正在做的事情va_list argptr;?我buffer太大了吗?
谢谢.
您显然尝试使用的技术表明您需要vsprintf(或更好vsnprintf)
va_list argptr;
va_start(argptr, format);
vsnprintf(buffer, sizeof buffer, format, argptr);
va_end(argptr);
Run Code Online (Sandbox Code Playgroud)
这就是v...组中这些函数存在于标准库中的原因.
调用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);
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以将内存管理策略更改为不同的内容,例如512在第一次调用中使用固定的本地字节缓冲区,然后仅在512证明不足时才在第二次调用中使用临时动态分配的缓冲区.等等...