以下代码将在Visual Studio 2012上提供预期的结果,但在XCode 5.0上则不会提供预期的结果。我想念什么?
static std::string format(const std::string fmt, ...)
{
va_list vl;
va_start(vl, fmt);
int size=vsnprintf(0, 0, fmt.c_str(), vl);
if(size<1)
return std::string();
char szBuf[256];
vsnprintf(szBuf, 256, fmt.c_str(), vl);
return szBuf;
}
电话:
for(int no=1;no<10;no++)
{
std::string strPath=format("entry%02d.txt",no);
}
在Windows上将导致正确的“ entry01.txt”,但在带有XCode的OSX上将为“ entry1852125044.txt”。
上面的代码被缩短以专注于该问题。这就是看起来奇怪的原因(要求大小而不使用它)。另外,我需要处理格式字符串。
最佳答案
您尝试遍历va_list
两次,每次调用vsnprintf
一次。您需要将每个迭代括在va_start/va_end
对中:
//...
va_start(vl, fmt);
int size=vsnprintf(0, 0, fmt.c_str(), vl);
va_end(v1);
//...
va_start(vl, fmt);
vsnprintf(szBuf, 256, fmt.c_str(), vl);
va_end(vl);