繁体   English   中英

是否有asprintf的wchar_t版本?

[英]Is there a wchar_t version for asprintf?

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

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

提到asprintf的标题似乎也没有帮助,因为它只提供非宽版本。

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

有任何想法吗? 谢谢!

是的, swprintf 请注意,尽管它的名称, swprintfsnprintf的宽字符等价物, 而不是 sprintf ,因为它需要缓冲区大小作为其第二个参数; (幸运的是)没有宽字符版本没有采用缓冲区大小。

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

POSIX 2008添加了open_wmemstream函数,该函数与vfwprintf一起完全满足您的需求。 它以前是GNU扩展,所以它已经在GNU系统上可用了很长时间。

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

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

  1. Windows有你想要的
  2. Linux有一个非广泛的变体( asprintf不是任何标准,但纯粹是Linux和* BSD的GNU扩展)。
  3. POSIX将所有相关的字符串/文件定义为以null结尾的char*数组,这解释了几乎没有任何POSIX函数的广泛版本的缺乏。
  4. 在2,3和4之上,所有现代Linux发行版都是基于UTF-8的,这意味着非宽版本是“意图使用”的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM