为什么C没有snwprintf函数?

为什么C没有snwprintf函数?,c,C,有人知道为什么C标准库中没有snwprintf函数吗 我知道swprintf,但这与snprintf的真正的wchar\t版本没有相同的语义。据我所知,使用[v]swprintf实现snwprintf函数并不容易: 与snprintf不同,swprintf不返回必要的缓冲区大小;如果提供的缓冲区不足,它只返回-1。这与由于编码错误而导致的失败是无法区分的,所以我不能继续尝试使用越来越大的缓冲区,希望它最终会成功 我想我可以将缓冲区的最后一个元素设置为非NUL,调用swprintf,并假设在该元素

有人知道为什么C标准库中没有
snwprintf
函数吗

我知道
swprintf
,但这与
snprintf
的真正的
wchar\t
版本没有相同的语义。据我所知,使用
[v]swprintf
实现
snwprintf
函数并不容易:

snprintf
不同,
swprintf
不返回必要的缓冲区大小;如果提供的缓冲区不足,它只返回-1。这与由于编码错误而导致的失败是无法区分的,所以我不能继续尝试使用越来越大的缓冲区,希望它最终会成功


我想我可以将缓冲区的最后一个元素设置为非NUL,调用
swprintf
,并假设在该元素为NUL之后发生截断。然而,这能保证有效吗?标准没有规定如果
swprintf
失败,缓冲区应处于何种状态。(相比之下,
snprintf
描述了哪些字符被写入,哪些字符被丢弃。)

请参见拉里·琼斯给出的答案


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

我同意他们不能通过更改
swprintf
来破坏向后兼容性,但他们本可以添加一个新的
snwprintf
函数。显然,他们觉得仅仅为了实现此行为而添加另一个函数是不值得的。实际上,许多标准化之前的
snprintf
的历史版本都具有与
swprintf
相同的“return-1”行为。委员会认为它是错误的,并指定了正确的行为,这破坏了与旧Unix(SUSv2)标准的兼容性。实际上,POSIX在这方面似乎也是自相矛盾的。它要求:“如果请求写入n个或更多宽字符……设置errno以指示错误。”,但是
EOVERFLOW
仅在
n>INT\u MAX
或结果字符串将长于
INT\u MAX
时记录为发生。对于输出不适合
n
字符的情况,没有指定
errno
的值……我认为您是对的,当
swprintf
失败时,您不能对缓冲区的内容进行任何假设。你能用
错误号
吗?我知道它可以在POSIX上运行,但是C本身可能不需要
EILSEQ
来处理编码错误…?@R..:谢谢
errno
是一个有趣的想法。不过,我认为如果我想要一个可移植的解决方案,我可能必须修改FreeBSD中的实际
vswprintf
实现=(请记住,重新实现printf系列函数可能不是一个好主意,因为您不能保证复制所有特定于语言环境的功能。