c++ 使用变量参数列表和字符串格式时出现问题

xuo3flqw  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(149)

我有下面的函数,它接受一个字符串和一个参数列表,其思想是它作为一个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
我猜是内存出了问题,但我不能发现问题出在哪里。

blpfk2vs

blpfk2vs1#

您使用了错误的打印函数。使用snprintf()时,您打印的是va_list本身的地址,而不是它所引用的值。
要打印va_list,您需要改用vsnprintf(),例如:

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 = vsnprintf(nullptr, 0, format.c_str(), arg_copy) + 1;
    va_end(arg_copy);

    vector<char> buffer(size);

    vsnprintf(buffer.data(), size, format.c_str(), arguments);
    va_end(arguments);

    description.append(buffer.data(), size - 1);
}

相关问题