使用标准char*
字符串时,snprintf
和vsnprintf
函数将返回输出字符串的长度,即使该字符串因溢出而被截断。*看起来像ISO C委员会在添加swprintf
和vswprintf
时不喜欢此功能,在溢出时返回-1。
是否有人知道提供此长度的功能?我不知道潜在字符串的大小。我可能会问太多,但是......我宁愿不这样做:
* 我意识到MSVC不会这样做,而是提供scprintf
和vscprintf
函数,但我正在寻找其他编译器,主要是GCC。 < / p>
答案 0 :(得分:2)
我最好的建议是不要使用wchar_t
字符串,特别是如果你不编写面向Windows的代码。如果这不是一个选项,这里有一些其他的想法:
如果您的格式字符串本身不包含非ASCII字符,那么首先使用相同的参数集调用vsnprintf
以获取字节长度,然后将其用作安全上限wchar_t
个字符的长度(如果有很少或非ASCII字符,则绑定会很紧。)
如果你可以引入对POSIX函数的依赖(可能会添加到C1x),请使用open_wmemstream
和fwprintf
。
只需迭代分配更大的缓冲区,但要聪明一点:在每一步几何上增加大小,例如: 127,255,511,1023,2047,...我喜欢这种模式比2的整体能力更好,因为很容易避免危险的情况,即SIZE_MAX / 2 + 1的分配可能成功但在下一次迭代时换行为0。
答案 1 :(得分:0)
返回宽字符串的缓冲区大小:
vswprintf(nullptr, -1, aFormat, argPtr);