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/