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