【问题标题】:Why does C not have an snwprintf function?为什么 C 没有 snwprintf 函数?
【发布时间】: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


【解决方案1】:

请参阅 Larry Jones here 给出的答案。

基本上,swprintf 是在 C95 中添加的,而 snprintf 是在 C99 中添加的,并且由于许多实现已经返回了所需字符的数量(对于 snprintf),这似乎是一件有用的事情,这就是行为那是标准化的。他们认为该行为的重要性不足以通过添加它来破坏与 swprintf 的向后兼容性(几年前添加它时没有该行为)。

【讨论】:

  • 我同意他们不能通过更改 swprintf 来破坏向后兼容性,但他们可以添加一个新的 snwprintf 函数。
  • 显然他们不觉得为了实现这种行为而添加另一个函数是值得的。
  • 实际上,在标准化之前,snprintf 的许多历史版本都与swprintf 具有相同的“返回-1”错误行为。委员会认为它已损坏并指定了正确的行为,这破坏了与旧 Unix (SUSv2) 标准的兼容性。
  • 其实POSIX在这方面也显得自相矛盾。它要求:“如果要求写入 n 个或更多宽字符...设置 errno 以指示错误。”,但 EOVERFLOW 仅在 n>INT_MAX 或结果字符串长于 @ 时记录为发生987654332@。没有为输出不适合n 字符的情况指定errno 的值...
猜你喜欢
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多