c++ - 计算 sprintf() 缓冲区的大小

标签 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)中遇到的明显错误是:

warning C4996: 'vsnprintf': This function or variable may be unsafe. Consider using vsnprintf_s instead. To disable deprecation use _CRT_SECURE_NO_WARNINGS. See online help for details.

我非常喜欢任何 C(++) 编译器的“将警告视为错误”选项,显然我的构建失败了。简单地使用 #pragma warning (disable:4996) 并继续使用它对我来说就像是在作弊。

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

TL/DR: 是否有一种方法可以实现 vsnprintf() 的预期行为,以使用新的、更安全的变体返回完成其任务所需的内存是吗?


编辑:简单地定义_CRT_SECURE_NO_WARNINGS 不会成功;还有很多 strcpy() 到处乱飞。它的新变体没有被破坏,所以我仍然希望看到这些。

最佳答案

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

关于c++ - 计算 sprintf() 缓冲区的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9369080/

相关文章:

c++ - 将变量传递给其他对话框 Qt

c++ - 实现特定 std::mbstate_t 的大小

android - 进入iOS和Android编程

c++ - "Function has no address"尽管禁用了优化 (/Od)

visual-c++ - 阿尔法混合去除图像中的接缝

c++ - 从类成员函数构造 std::thread

c - 打印成功后 printf 崩溃

c++ - 与 C++ 中的数组相比,为什么一个类使用这么多内存

c++ - unsigned long 的 snprintf 附加逗号

c++ - 为什么在包含 iostream 时可以使用 printf()?