将va_list传入sprintf导致整数数值输出异常
问题根源与解决方法
你的问题出在错误使用了sprintf函数——sprintf不支持直接传入va_list类型的参数。你当前的代码里把argptr(指向参数列表的指针)直接传给sprintf,它会把这个指针本身的内存地址当成格式串对应的整数参数,所以才会输出那些莫名其妙的大数值。
正确的做法是使用专门处理可变参数列表的vsprintf函数,它的设计就是配合va_list来工作的。
修正后的代码
void write_log(const char* format, ...) { char formatted_string[256]; va_list argptr; va_start(argptr, format); // 替换sprintf为vsprintf int len = vsprintf(formatted_string, format, argptr); va_end(argptr); // formatted_string sent to JSON builder }
额外建议:避免缓冲区溢出
如果日志内容可能超过256字节,建议用更安全的vsnprintf,它可以指定最大写入字节数,防止缓冲区溢出:
void write_log(const char* format, ...) { char formatted_string[256]; const size_t buf_size = sizeof(formatted_string); va_list argptr; va_start(argptr, format); // 第三个参数限制写入的最大字节数,自动追加结束符 int len = vsnprintf(formatted_string, buf_size, format, argptr); va_end(argptr); // 返回值大于等于buf_size说明内容被截断,可按需处理 if (len >= buf_size) { // 例如打印警告或扩容缓冲区 } // formatted_string sent to JSON builder }
内容的提问来源于stack exchange,提问作者zmechanic
相关产品推荐
相关产品推荐

