C语言 将va_list向下传递给sprintf会导致错误的整数值[重复]

ru9i0ody  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(183)

此问题在此处已有答案

stdarg.h formating string via snprintf not working, arguments are ignored(1个答案)
昨天关门了。
我尝试在C函数中使用可变数量的参数封装sprintf调用。原因是我希望有一个日志 Package 器通过网络以JSON格式发送日志,而不是写入控制台。我不想在每次日志调用之前调用sprintf,而是像sprintf函数本身一样传递格式和参数。
我按照这个问题How to pass variable number of arguments to printf/sprintf,我得到了字符串在format参数正确工作,但数字参数打印与%i不知何故打印错误。
例如:
我打印的不是40,而是1073546032
我打印的不是0,而是1073545776
如果我在调用log函数之前执行sprintf,我会在结果字符串中看到正确的数字。
下面是我的代码,但它与其他类似问题完全相同:

void write_log(const char* format, ...)
{
    char formatted_string[256];

    va_list argptr;
    va_start(argptr, format);
    int len = sprintf(formatted_string, format, argptr);
    va_end(argptr);

    // formatted_string sent to JSON builder
}
rhfm7lfc

rhfm7lfc1#

必须使用vsprintf(但实际上应该使用vsnprintf,这样就不会有缓冲区溢出的风险)。
所有的*printf函数都有一个v版本,它接受一个va_list而不是可变参数。

相关问题