【发布时间】:2017-12-21 20:48:21
【问题描述】:
我需要计算格式化 wchar 数组所需的大小。
考虑以下代码:
wchar_t* Format(const wchar_t* format, ...)
{
va_list args;
va_start(args, format);
wchar_t *w = NULL;
int len = _vsnwprintf(NULL, 0, format, args) + 1; // <------ Error
if (len > 0)
{
w = new wchar_t[len];
w[0] = 0;
_vsnwprintf_s(w, len, len, format, args);
}
va_end(args);
return w;
}
如果_CRT_SECURE_NO_WARNINGS被打开,上面的代码可以工作,如果没有,错误说:
'_vsnwprintf':这个函数或变量可能不安全。考虑使用 _vsnwprintf_s 代替。
但我无法设法使用_vsnwprintf_s 来计算 wchar 缓冲区所需的大小。
以下是我尝试过的:
int len = _vsnwprintf_s(NULL, 0, 0, format, args); // return 1
// debug assertion failed: string != NULL && DstSizeInWords > 0
int len = _vsnwprintf_s(NULL, 0, INT_MAX, format, args);
// debug assertion failed: string != NULL && DstSizeInWords > 0
int len = _vsnwprintf_s(NULL, INT_MAX, 0, format, args);
// debug assertion failed: string != NULL && DstSizeInWords > 0
int len = _vsnwprintf_s(NULL, INT_MAX, INT_MAX, format, args);
其他功能:_snwprintf给_CRT_SECURE错误和_snwprintf_s与_vsnwprintf_s效果相同
问题:
虽然我打开_CRT_SECURE_NO_WARNINGS 很好,但我想知道如何计算格式化wchar 数组所需的大小,CRT_SECURE 方式?请注意,它必须接受va_list 作为agrument。
【问题讨论】: