我需要一个C函数,它返回格式化字符串的最终长度,这样我就可以正确地分配目标字符串,而不是自己计算长度。有snprintf
这样就无法写出整个字符串,但遗憾的是没有宽字符替代它。
swprintf
如果出现错误则返回-1,而不是所需的长度(为什么不是相同的行为?!?)
提到的标题asprintf
似乎也无济于事,因为它只提供非宽版本。
_vscwprintf
可用于Windows,但我需要一个跨平台,标准版本或至少一个Linux版本,我将#ifdef代码。
有什么想法吗?谢谢!
答案 0 :(得分:3)
是的,swprintf
。请注意,尽管名称为swprintf
,但snprintf
的宽字符等效于<{1}},而不是 sprintf
,因为它将缓冲区大小作为其第二个参数; (幸运的是)没有宽字符版本没有采用缓冲区大小。
此外,由于它在溢出时返回-1,因此您必须以其他方式获取字符串的总长度。唯一真正可移植的方法是从一个大小的缓冲区开始,尝试格式化并查看它是否足够大,如果没有,请增加大小并重新格式化,直到它足够大。你可以想象这不是很有效率。
答案 1 :(得分:3)
POSIX 2008添加了open_wmemstream
功能,它与vfwprintf
一起完全符合您的需要。它以前是GNU扩展,所以它已经在GNU系统上可用了很长时间。
这可以很容易地用于构造awprintf
包装器。
答案 2 :(得分:2)
嗯,你的期望似乎存在根本性的缺陷。添加这些:
asprintf
不是任何标准,但纯粹是Linux和* BSD的GNU扩展。)char*
数组,这解释了缺少任何POSIX函数的广泛版本。添加这些内容会给出:为什么你需要这样的东西?当然你没有在Unix上使用wchar_t
你是;)
。如果是的话,还有两个选择:切换到类似tchar
的解决方案(平台相关的typedef)或完全切换到UTF-8。