![](/img/trans.png)
[英]Why there are no “unsigned wchar_t” and “signed wchar_t” types?
[英]Is there a wchar_t version for asprintf?
我需要一个C函数,它返回格式化字符串的最终长度,这样我就可以正确地分配目标字符串,而不是自己计算长度。 有一个snprintf
在无法写入整个字符串的情况下就这样做了,但遗憾的是没有宽字符替代它。
如果出现错误, swprintf
返回-1,而不是所需的长度(为什么不是相同的行为?!?)
提到asprintf
的标题似乎也没有帮助,因为它只提供非宽版本。
_vscwprintf
可以在windows上使用,但我需要一个跨平台,标准版本,或至少一个Linux版本,我将#ifdef代码。
有任何想法吗? 谢谢!
是的, swprintf
。 请注意,尽管它的名称, swprintf
是snprintf
的宽字符等价物, 而不是 sprintf
,因为它需要缓冲区大小作为其第二个参数; (幸运的是)没有宽字符版本没有采用缓冲区大小。
此外,由于它在溢出时返回-1,因此您必须以其他方式获取字符串的总长度。 唯一真正可移植的方法是从一些大小的缓冲区开始,尝试格式化并查看它是否足够大,如果没有,请增加大小并重新格式化,直到它足够大。 你可以想象这不是很有效率。
POSIX 2008添加了open_wmemstream
函数,该函数与vfwprintf
一起完全满足您的需求。 它以前是GNU扩展,所以它已经在GNU系统上可用了很长时间。
这可以很容易地用于构造awprintf
包装器。
好吧,你的期望似乎存在根本性的缺陷。 添加这些:
asprintf
不是任何标准,但纯粹是Linux和* BSD的GNU扩展)。 char*
数组,这解释了几乎没有任何POSIX函数的广泛版本的缺乏。 添加它们会给出:为什么你需要这样的东西? 当然,你不是在Unix上使用wchar_t
s ;)
是的;)
。 如果是,还有两个选择:切换到类似tchar
的解决方案(平台相关的typedef)或完全切换到UTF-8。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.