计算sprintf()缓冲区的大小

时间:2012-02-20 22:01:31

标签: c++ visual-c++ printf

A(非常长)前一段时间我经常使用下面的代码 - 然后在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();

    // ...
}

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

  

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

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

建议的“更安全”的替代vsnprintf_s(),但是当其“不安全”的前任的输入条件发生时is doomed to return -1

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


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

1 个答案:

答案 0 :(得分:12)

您要查看的函数是_vscprintf,其中“返回打印参数列表所指向的字符串或将其发送到文件或缓冲区时将生成的字符数使用指定的格式代码“。还有一个widechar变体(_vscwprintf)。