此问题在此处已有答案:
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
}
1条答案
按热度按时间rhfm7lfc1#
必须使用
vsprintf
(但实际上应该使用vsnprintf
,这样就不会有缓冲区溢出的风险)。所有的
*printf
函数都有一个v
版本,它接受一个va_list
而不是可变参数。