从wsprintf获取格式化字符串的长度

时间:2011-05-25 23:11:46

标签: c wchar-t

使用标准char*字符串时,snprintfvsnprintf函数将返回输出字符串的长度,即使该字符串因溢出而被截断。*看起来像ISO C委员会在添加swprintfvswprintf时不喜欢此功能,在溢出时返回-1。

是否有人知道提供此长度的功能?我不知道潜在字符串的大小。我可能会问太多,但是......我宁愿不这样做:

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

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

2 个答案:

答案 0 :(得分:2)

我最好的建议是不要使用wchar_t字符串,特别是如果你不编写面向Windows的代码。如果这不是一个选项,这里有一些其他的想法:

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

  2. 如果你可以引入对POSIX函数的依赖(可能会添加到C1x),请使用open_wmemstreamfwprintf

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

答案 1 :(得分:0)

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

vswprintf(nullptr, -1, aFormat, argPtr);