gpt4 book ai didi

c - 为什么 vsnwprintf 不见了

转载 作者:太空宇宙 更新时间:2023-11-04 04:16:47 24 4
gpt4 key购买 nike

我将 vsnprintf 用于 ansi 字符串,它运行良好,仅在出错时返回 -1,如果它不适合缓冲区,则返回所需大小的计数。我需要宽字符串的相同函数,vsnwprintf 只是不存在。我也试过 _vsnwprintf,但它的行为真的很不一样,它返回 -1 即使缓冲区太小,虽然我需要知道扩展缓冲区多少,但只有在必要时,我才不知道想要进行虚拟调用只是为了确定所需的大小,然后才扩展缓冲区。

如果看vsnprintf代码:

int const _Result = __stdio_common_vsprintf(
_CRT_INTERNAL_LOCAL_PRINTF_OPTIONS | _CRT_INTERNAL_PRINTF_STANDARD_SNPRINTF_BEHAVIOR,
_Buffer, _BufferCount, _Format, NULL, _ArgList);
return _Result < 0 ? -1 : _Result;

虽然 _vsnwprintf 大约有:

int const _Result = __stdio_common_vswprintf(
_CRT_INTERNAL_LOCAL_PRINTF_OPTIONS | _CRT_INTERNAL_PRINTF_LEGACY_VSPRINTF_NULL_TERMINATION,
_Buffer, _BufferCount, _Format, NULL, _ArgList);
return _Result < 0 ? -1 : _Result;

看起来只是标志不同,我尝试使用 _CRT_INTERNAL_PRINTF_STANDARD_SNPRINTF_BEHAVIOR 标志手动调用 __stdio_common_vswprintf,它完全按照我的需要工作,但也会导致随机崩溃/卡住应用程序退出。所以我需要 vsnwprintf 函数,也许有人知道怎么做?

附言我在 Windows 7 上使用 Microsoft Visual Studio 2017。

最佳答案

vsnprintf 的宽字符版本称为vswprintf(注意:没有n)。根据the documentation ,它符合 ISO C,因此您可以检查 C 标准或 here 中的行为.

当输出超过缓冲区大小时,它返回 -1 是正确的。没有截断输出的选项;您应该进行“虚拟调用”来检查缓冲区大小。

您总是可以将 vswprintf 调用包装在另一个具有您想要的行为的函数中(进行虚拟调用,然后截断以适合,或返回 malloc 缓冲区)。谨防在 UTF-16 字符中间截断。


请注意,MSVC 的 vsnprintf 在某些时候(可能是 2015 年?)改变了它的行为以符合 ISO C;可以通过调用 _vsnprintf 来检索原始 MSVC 行为。

关于c - 为什么 vsnwprintf 不见了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51134188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com