2011-01-26 57 views
7

我需要一个C函数,它返回格式化字符串的最终长度,以便我可以正确分配目标字符串,而不是自己计算长度。有snprintf这就无法编写整个字符串,但不幸的是没有宽字符替代它。是否有asprintf的wchar_t版本?

swprintf返回-1在错误的情况下,不

标题提到asprintf所需长度(为什么不一样的行为?!?)好像是没有帮助还,因为它提供了一个非宽仅版本。

_vscwprintf可以在windows上使用,但我需要一个跨平台,标准版本或者至少一个Linux版本,我会#ifdef代码。

任何想法?谢谢!

回答

3

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

这可以很容易地用来构造一个awprintf包装。

2

那么,你的期望似乎有一个根本的缺陷。加上这些:

  1. Windows有你想要什么
  2. Linux有一个非宽变种(asprintf没有任何标准,而纯粹是一个GNU扩展为Linux和* BSD)。
  3. POSIX定义了所有相关的字符串/文件作为以NULL结尾的char*数组,这说明几乎没有任何POSIX函数的宽版本。
  4. 除2,3和4之外,所有现代Linux发行版均基于UTF-8,这意味着非广泛版本是“旨在使用”的内容。

添加这些:你为什么需要这样的东西?当然你在Unix上没有使用wchar_t s你是;)。如果是的话,还有两种选择:切换到类似tchar的解决方案(与平台相关的typedef)或完全切换到UTF-8。

+0

感谢您的回答。是的,我不得不使用wchar_t并切换到UTF-8可能太昂贵。 – gheorghe1800 2011-01-26 20:39:51

+0

@ gheorghe1800:废弃wchar_t并使用[UTF-8](http://utf8everywhere.org/)。如果你遵循了它,这个问题就不会出现。 – ybungalobill 2012-05-03 16:59:43

3

是,swprintf。请注意,尽管它的名称是swprintf,但其宽度相当于snprintf,而不是sprintf,因为它将缓冲区大小作为其第二个参数;幸运的是,没有宽字符的版本没有缓冲区大小。

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

+0

谢谢。这是我首先想到的,我只是希望有一个更好的解决方案已经实施。最后,我想我必须自己计算长度,这在一般情况下似乎很容易出错,但我会确保彻底。 – gheorghe1800 2011-01-26 20:47:16

相关问题