我有下面的函数,它接受一个字符串和一个参数列表,其思想是它作为一个printf为用户工作。下面的函数是一个最小的可执行的函数的例子。
string description = "";
void error(string format, ...){
va_list arguments;
va_start(arguments, format);
va_list arg_copy;
va_copy(arg_copy, arguments);
const int32_t size = snprintf(nullptr, 0, format.c_str(), arguments) + 1;
const unique_ptr<char[]> buffer = make_unique<char[]>(size);
va_end(arguments);
snprintf(buffer.get(), size, format.c_str(), arg_copy);
va_end(arg_copy);
description += string(buffer.get(), buffer.get() + size - 1);
}
我这样称呼它。
int main()
{
int a = 123;
error("Format %d", a);
cout<< description;
return 0;
}
预期输出为:格式123
输出结果为(每次执行时该数字会发生变化):格式378812424
我猜是内存出了问题,但我不能发现问题出在哪里。
1条答案
按热度按时间blpfk2vs1#
您使用了错误的打印函数。使用
snprintf()
时,您打印的是va_list
本身的地址,而不是它所引用的值。要打印
va_list
,您需要改用vsnprintf()
,例如: