有人知道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 ICEerrno
是一个有趣的想法。不过,我认为如果我想要一个可移植的解决方案,可能就必须修改来自 FreeBSD 的实际vswprintf
实现了。=( - jamesdlin