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

| 当使用标准
char*
字符串时,
snprintf
vsnprintf
函数将返回输出字符串的长度,即使该字符串由于溢出而被截断也是如此。*似乎ISO C委员会在添加when3 when和ѭ3时不喜欢此功能。
vswprintf
,溢出时返回-1。 有谁知道会提供这种长度的功能?我不知道潜在字符串的大小。我可能要问的太多了,但是我宁愿不要: 分配一个巨大的静态临时缓冲区 迭代分配和释放内存,直到找到合适的大小为止 添加额外的库依赖 写我自己的格式字符串解析器 *我意识到MSVC并没有这样做,而是提供了
scprintf
和ѭ6,函数,但是我正在寻找其他编译器,主要是GCC。     
已邀请:
我最好的建议是根本不使用
wchar_t
字符串,特别是如果您不编写面向Windows的代码。如果这不是一个选择,那么还有其他一些建议: 如果您的格式字符串本身不包含非ASCII字符,那么首先使用相同的参数集调用
vsnprintf
以获取以字节为单位的长度,然后将其用作
wchar_t
个字符的长度的安全上限(如果很少)或非ASCII字符,则边界会紧密)。 如果您可以引入对POSIX函数的依赖关系(可能会添加到C1x),请使用
open_wmemstream
fwprintf
。 只是迭代分配更大的缓冲区,但要聪明地做:在每个步骤上以几何方式增加大小,例如127、255、511、1023、2047,...我比2的整数幂更喜欢这种模式,因为它很容易避免发生危险的情况,即SIZE_MAX / 2 + 1可能会成功分配,但是在下一次迭代。     
这将返回宽字符串的缓冲区大小:
vswprintf(nullptr, -1, aFormat, argPtr);
    

要回复问题请先登录注册