我有以下功能:
void raiseError(const char *msg, ...)
{
va_list ap;
va_start(ap, msg); // use variable arg list
int size = vsnprintf(nullptr, 0, msg, ap);
std::vector<char> s(size+1, 0);
vsnprintf(s.data(), size, msg, ap);
va_end(ap);
errorString = std::string(s.data()));
}
当我打电话
raiseError("File not found in <%s> : <%s>", "a", "b" );
第一个vsnprintf调用(计算最终的字符串大小)返回正确的值27.但是最后一个字符串是:
“&lt; ** A *&gt;:”
中找不到文件“*”字符在程序启动时是随机的。
此外,该程序在MinGW中运行,只有linux gcc才能看到这个问题。
我的代码有什么问题?
答案 0 :(得分:5)
你不能多次使用ap。考虑使用va_copy。