0

次のコードは、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」になります。

上記のコードは、問題に焦点を当てるために短縮されています。それが奇妙に見える理由です (サイズを尋ねて、それを使用しないでください)。また、フォーマット文字列を処理する必要があります。

4

1 に答える 1

7

va_listへの呼び出しごとに 1 回、2 回繰り返し処理しようとしてい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);
于 2013-11-13T13:48:28.203 に答える