1

linux机器上该功能的直接替代方案是vsnwprintf什么,应该包含哪些标头才能使用它?

感谢您的任何建议

4

6 回答 6

3

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

于 2012-05-04T10:14:16.090 回答
3

这取决于vsnwprintf() (原文如此)做什么以及它的参数列表是什么。

C99 标准描述(在第vswprintf()7.24.2.7 节中)。要使用它,您需要 #include<stdarg.h><wchar.h>. 实现应该在标准库中。

于 2012-05-04T10:16:43.043 回答
1

没有其他选择。

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

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

于 2017-09-19T00:02:19.600 回答
0

似乎 libicu 中的u_vsnprintf()u_vsnprintf_u()是您需要的

于 2014-12-25T10:37:49.327 回答
0

的截断版本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 应该足够了。

于 2017-09-04T08:57:35.323 回答
0

这是解决方法的示例:

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

可能需要以某种方式限制迭代次数。

于 2022-01-29T04:53:37.080 回答