关于Linux上的c:vsnwprintf替代品

vsnwprintf alternative on linux

在Linux机器上,vsnwprintf函数的直接替代方法是什么?使用它应该包含哪些标题?

感谢您的任何建议


它取决于vsnwprintf()(sic)的功能及其参数列表。

C99标准描述了vswprintf()(在7.24.2.7节中)。要使用它,您需要#include 。实现应在标准库中。


此功能的Linux变体是snprintfvsnprintf,它们由stdio.h提供:

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);

wchar.h提供的Unicode版本:

1
2
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


别无选择。

其他答案中建议的vswprintf不会告诉您所需的缓冲区长度。当您将nullptr和0传递给前两个参数时,它将返回-1,而不是所需的缓冲区长度。这既是文档的记录方式,也是它在clang 4中的实际工作方式。

该答案有一个解决方法
https://stackoverflow.com/a/16352146/126995
滚动到vscwprintf源代码的末尾。该解决方法适用于较小的字符串,但适用于较大的字符串,速度相对较慢,甚至可以耗尽非常大的字符串的堆栈空间。


vswprintf()的截断版本不安全。
您确实想要C11 vswprintf_s(),它可以确保以空定界的宽字符串,并且在目标缓冲区太小时会出错。

如您所知,这些广泛的变体没有使用NULL缓冲区来计算大小的API。如果缓冲区太小,则需要在错误时扩展缓冲区。

无论如何,safeclib-3.0将提供所有这些。
使用--enable-unsafe,宽或非宽,截断('n')或不截断来安全和不安全。
https://github.com/rurban/safeclib/blob/wchar/src/wchar/vsnwprintf_s.c

vsnwprintf位于C99,MSVC和其他一些版本中。不拘泥。
-stc=c99对于glibc应该足够了。


似乎需要libicu的u_vsnprintf()或u_vsnprintf_u()