vsnwprintf alternative on linux
在Linux机器上,
感谢您的任何建议
它取决于
C99标准描述了
此功能的Linux变体是
1 2 | int snprintf(char *str, size_t size, const char *format, ...); int vsnprintf(char *str, size_t size, const char *format, va_list args); |
和
1 2 |
http://linux.die.net/man/3/snprintf
http://linux.die.net/man/3/swprintf
别无选择。
其他答案中建议的vswprintf不会告诉您所需的缓冲区长度。当您将nullptr和0传递给前两个参数时,它将返回-1,而不是所需的缓冲区长度。这既是文档的记录方式,也是它在clang 4中的实际工作方式。
该答案有一个解决方法
https://stackoverflow.com/a/16352146/126995
滚动到vscwprintf源代码的末尾。该解决方法适用于较小的字符串,但适用于较大的字符串,速度相对较慢,甚至可以耗尽非常大的字符串的堆栈空间。
您确实想要C11
如您所知,这些广泛的变体没有使用NULL缓冲区来计算大小的API。如果缓冲区太小,则需要在错误时扩展缓冲区。
无论如何,safeclib-3.0将提供所有这些。
使用--enable-unsafe,宽或非宽,截断('n')或不截断来安全和不安全。
https://github.com/rurban/safeclib/blob/wchar/src/wchar/vsnwprintf_s.c
似乎需要libicu的u_vsnprintf()或u_vsnprintf_u()