带有变量参数的 vsnprintf 问题

vsnprintf problems with variable arguments

本文关键字:vsnprintf 问题 参数 变量      更新时间:2023-10-16

以下代码将在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);