1

使用标准char*字符串时,snprintfandvsnprintf函数将返回输出字符串的长度,即使该字符串由于溢出而被截断。*似乎 ISO C 委员会在添加swprintfand时不喜欢这个功能vswprintf,它返回 -1在溢出。

有谁知道可以提供这个长度的函数?我不知道潜在字符串的大小。我可能要求太多,但是..我宁愿不:

  • 分配一个巨大的静态临时缓冲区
  • 迭代地分配和释放内存,直到找到适合的大小
  • 添加一个额外的库依赖
  • 编写我自己的格式字符串解析器

*我意识到 MSVC 不这样做,而是提供scprintfandvscprintf函数,但我正在寻找其他编译器,主要是 GCC。

4

2 回答 2

2

我对您的最佳建议是根本不要使用wchar_t字符串,尤其是在您不编写面向 Windows 的代码时。如果这不是一个选项,这里有一些其他的想法:

  1. 如果您的格式字符串本身不包含非 ASCII 字符,那么首先vsnprintf使用相同的参数集调用以获取字节长度,然后将其用作字符长度的安全上限wchar_t(如果很少或没有-ASCII 字符,界限会很紧)。

  2. 如果您对引入对 POSIX 函数(可能会被添加到 C1x)的依赖感到满意,请使用open_wmemstreamand fwprintf.

  3. 只是迭代分配更大的缓冲区,但要聪明:在每一步以几何方式增加大小,例如 127、255、511、1023、2047,...我喜欢这种模式比 2 的整数幂更好,因为它很容易避免危险情况其中 SIZE_MAX/2+1 的分配可能会成功,但在下一次迭代时会换成 0。

于 2011-05-25T23:23:27.373 回答
0

这将返回宽字符串的缓冲区大小:

vswprintf(nullptr, -1, aFormat, argPtr);
于 2012-10-18T21:46:03.480 回答