linux机器上该功能的直接替代方案是vsnwprintf
什么,应该包含哪些标头才能使用它?
感谢您的任何建议
snprintf
此函数的Linux 变体由以下vsnprintf
机构友情提供stdio.h
:
int snprintf(char *str, size_t size, const char *format, ...);
int vsnprintf(char *str, size_t size, const char *format, va_list args);
和 Unicode 版本由wchar.h
:
int swprintf(wchar_t *wcs, size_t maxlen, const wchar_t *format, ...);
int vswprintf(wchar_t *wcs, size_t maxlen, const wchar_t *format, va_list args);
http://linux.die.net/man/3/snprintf
http://linux.die.net/man/3/swprintf
这取决于vsnwprintf()
(原文如此)做什么以及它的参数列表是什么。
C99 标准描述(在第vswprintf()
7.24.2.7 节中)。要使用它,您需要 #include<stdarg.h>
和<wchar.h>
. 实现应该在标准库中。
没有其他选择。
其他答案中建议的 vswprintf 并未说明所需的缓冲区长度。当您将 nullptr 和 0 传递给前两个参数时,它将返回 -1,而不是所需的缓冲区长度。这既是它的记录方式,也是它在 clang 4 中的实际工作方式。
该答案中有一个解决方法 https://stackoverflow.com/a/16352146/126995 滚动到 vscwprintf 源代码的末尾。该解决方法适用于小字符串,但对于较大的字符串相对较慢,甚至可能会耗尽非常大的字符串的堆栈空间。
似乎 libicu 中的u_vsnprintf()或u_vsnprintf_u()是您需要的
的截断版本vswprintf()
是不安全的。你真的想要 C11 vswprintf_s()
,它确保一个空分隔的宽字符串,并且在目标缓冲区太小时时出错。
如您所知,宽变体没有 API 来计算 NULL 缓冲区的大小。如果缓冲区太小,您需要在错误时扩展缓冲区。
无论如何,safeclib-3.0将提供所有这些。安全和不安全与 --enable-unsafe、宽或非宽、截断 ('n') 或不截断。 https://github.com/rurban/safeclib/blob/wchar/src/wchar/vsnwprintf_s.c
vsnwprintf
在 C99、MSVC 和其他一些中。不是肌肉。
-stc=c99
对于 glibc 应该足够了。
这是解决方法的示例:
int vsnwprintf(wchar_t* buffer, size_t size, const wchar_t* format, va_list& params)
{
if(buffer || size)
return vswprintf(buffer, size, format, params);
int result = -1;
for(size = 100; result < 0; size += 100)
{
unique_ptr<wchar_t[]> guard(buffer = new wchar_t[size]);
va_list copy;
va_copy(copy, params);
result = vswprintf(buffer, size, format, copy);
va_end(copy);
}
return result;
};
可能需要以某种方式限制迭代次数。