- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我将 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/
以下代码没有产生预期的输出。为什么? wchar_t* wchar_t_printf_return(wchar_t* formatstring, ...){ va_list a
我将 vsnprintf 用于 ansi 字符串,它运行良好,仅在出错时返回 -1,如果它不适合缓冲区,则返回所需大小的计数。我需要宽字符串的相同函数,vsnwprintf 只是不存在。我也试过 _v
代码: #include #include #include std::wstring string_format(const std::wstring &fmt, ...) { int s
在 Linux 机器上 vsnwprintf 函数的直接替代方法是什么?应该包含哪些头文件才能使用它? 谢谢你的建议 最佳答案 这取决于什么vsnwprintf() (sic) 做了什么,它的参数列表
我是一名优秀的程序员,十分优秀!