【发布时间】:2010-09-12 02:14:45
【问题描述】:
有人知道为什么C标准库中没有snwprintf函数吗?
我知道swprintf,但这与snprintf 的真正wchar_t 版本的语义不同。据我所知,没有简单的方法可以使用[v]swprintf 实现snwprintf 函数:
与snprintf 不同,swprintf 不返回必要的缓冲区大小;如果提供的缓冲区不足,它只返回-1。这与由于编码错误导致的失败无法区分,因此我无法继续重试逐渐增大的缓冲区,希望它最终会成功。
我想我可以将缓冲区的最后一个元素设置为非 NUL,调用swprintf,然后假设该元素为 NUL 时发生截断。但是,这能保证有效吗?如果swprintf 失败,该标准没有指定缓冲区应该处于什么状态。 (相比之下,snprintf 描述了哪些字符被写入,哪些被丢弃。)
【问题讨论】:
-
我认为你是对的,当
swprintf失败时,你不能假设缓冲区的内容。你能用errno吗?我知道它可以在 POSIX 上运行,但 C 本身可能不需要EILSEQ来处理编码错误...? -
@R..:谢谢。
errno是一个有趣的想法。不过,我想如果我想要一个可移植的解决方案,我可能必须从 FreeBSD 修改一个实际的vswprintf实现。 =( -
请记住,重新实现 printf-family 函数可能不是一个好主意,因为您不能保证复制所有特定于语言环境的功能。
标签: c