是否有asprintf的wchar_t版本?

时间:2011-01-26 20:02:54

标签: c wchar-t printf

我需要一个C函数,它返回格式化字符串的最终长度,这样我就可以正确地分配目标字符串,而不是自己计算长度。有snprintf这样就无法写出整个字符串,但遗憾的是没有宽字符替代它。

swprintf如果出现错误则返回-1,而不是所需的长度(为什么不是相同的行为?!?)

提到的标题asprintf似乎也无济于事,因为它只提供非宽版本。

_vscwprintf可用于Windows,但我需要一个跨平台,标准版本或至少一个Linux版本,我将#ifdef代码。

有什么想法吗?谢谢!

3 个答案:

答案 0 :(得分:3)

是的,swprintf。请注意,尽管名称为swprintf,但snprintf的宽字符等效于<{1}},而不是 sprintf,因为它将缓冲区大小作为其第二个参数; (幸运的是)没有宽字符版本没有采用缓冲区大小。

此外,由于它在溢出时返回-1,因此您必须以其他方式获取字符串的总长度。唯一真正可移植的方法是从一个大小的缓冲区开始,尝试格式化并查看它是否足够大,如果没有,请增加大小并重新格式化,直到它足够大。你可以想象这不是很有效率。

答案 1 :(得分:3)

POSIX 2008添加了open_wmemstream功能,它与vfwprintf一起完全符合您的需要。它以前是GNU扩展,所以它已经在GNU系统上可用了很长时间。

这可以很容易地用于构造awprintf包装器。

答案 2 :(得分:2)

嗯,你的期望似乎存在根本性的缺陷。添加这些:

  1. Windows有你想要的东西
  2. Linux有一个非广泛的变种(asprintf不是任何标准,但纯粹是Linux和* BSD的GNU扩展。)
  3. POSIX将与字符串/文件相关的所有内容定义为以null结尾的char*数组,这解释了缺少任何POSIX函数的广泛版本。
  4. 除了2,3和4之外,所有现代Linux发行版都是基于UTF-8的,这意味着非宽版本是“意图使用”。
  5. 添加这些内容会给出:为什么你需要这样的东西?当然你没有在Unix上使用wchar_t你是;)。如果是的话,还有两个选择:切换到类似tchar的解决方案(平台相关的typedef)或完全切换到UTF-8。