为什么C语言没有snwprintf函数?

13

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

我知道有swprintf,但它并不具备真正的wchar_t版本的snprintf所具有的语义。据我所知,使用[v]swprintf没有简便的方法来实现snwprintf

snprintf不同,swprintf不会返回所需的缓冲区大小;如果提供的缓冲区不足,则它只返回-1。这与由于编码错误导致的失败是无法区分的,因此我不能通过使用逐渐增大的缓冲区重试来期望它最终会成功。

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


我认为你说得对,当swprintf失败时,不能假设缓冲区的内容。你能使用errno吗?我知道在POSIX上它可以工作,但是C本身可能不需要EILSEQ来处理编码错误...? - R.. GitHub STOP HELPING ICE
@R..:谢谢。errno 是一个有趣的想法。不过,我认为如果我想要一个可移植的解决方案,可能就必须修改来自 FreeBSD 的实际 vswprintf 实现了。=( - jamesdlin
请记住,重新实现 printf 系列函数可能是一个坏主意,因为您无法保证复制所有特定于区域设置的功能。 - R.. GitHub STOP HELPING ICE
1个回答

6
请参考Larry Jones的答案这里。本质上,swprintf是在C95中添加的,而snprintf是在C99中添加的。由于许多实现已经返回所需字符的数量(对于snprintf),并且这似乎是一件有用的事情,因此这就是被规范化的行为。他们认为这种行为不重要到足以破坏向后兼容性,因此没有添加它(几年前添加了没有这种行为的swprintf)。

2
我同意他们不能通过更改 swprintf 来破坏向后兼容性,但他们可以添加一个新的 snwprintf 函数。 - jamesdlin
显然,他们觉得添加另一个函数来实现这种行为不值得。 - Robert Gamble
2
实际上,在标准化之前,许多历史版本的 snprintfswprintf 一样存在着错误的“返回 -1”的行为。委员会认为这是有问题的,并指定了正确的行为,这破坏了与旧的Unix(SUSv2)标准的兼容性。 - R.. GitHub STOP HELPING ICE
1
实际上,在这方面,POSIX也似乎自相矛盾。它要求:“如果请求写入n个或更多的宽字符...则设置errno以指示错误。”但是,只有在“n> INT_MAX”或结果字符串超过“INT_MAX”的情况下才记录了EOVERFLOW。未指定errno的任何值,用于输出不适合n个字符的情况... - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接