计算sprintf()缓冲区的大小

Lin*_*een 9 c++ printf visual-c++

一段时间(非常长)我经常使用下面的代码 - 然后在MSVC 6上 - 确定为具有可变参数的函数格式化字符串所需的内存:

void LogPrint(const char *pszFormat, ...)
{
    int          nBytes;
    char        *pszBuffer;
    va_list      args;

    va_start(args, pszFormat);
    nBytes = vsnprintf(0, 0, pszFormat, va);
    va_end(args);

    // error checking omitted for brevity
    pszBuffer = new char[nBytes + 1];

    va_start(args, pszFormat);
    vsnprintf(pszBuffer, nBytes, pszFormat, va);
    va_end();

    // ...
}
Run Code Online (Sandbox Code Playgroud)

您在更新版本的MSVC(我现在使用的是2010)中遇到的明显错误是:

警告C4996:'vsnprintf':此函数或变量可能不安全.请考虑使用vsnprintf_s.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS.详细信息请参见在线帮助.

我是任何C(++)编译器的"将警告视为错误"选项的忠实粉丝,显然我的构建失败了.简单地使用#pragma warning (disable:4996)并继续使用它就像欺骗我一样.

所建议的"更安全"的替代vsnprintf_s(),但是注定要返回-1时,其"不安全"前身输入条件发生.

TL/DR:有没有办法实现预期的行为,vsnprintf()使用新的,更安全的变体来返回完成任务所需的内存?


编辑:简单定义_CRT_SECURE_NO_WARNINGS不会削减它; 还有很多strcpy()飞来飞去.它的新变种没有被打破,所以我仍然希望看到这些.

Chr*_*s J 12

你想看看是函数_vscprintf,其中"返回如果字符串指向参数列表进行打印或使用指定的格式代码发送到一个文件或缓冲区,将生成的字符数".还有一个widechar变种(_vscwprintf).