没有缓冲区大小的 vswprintf() 在小缓冲区而不是 EOF 上崩溃。如何传递缓冲区大小

Posted

技术标签:

【中文标题】没有缓冲区大小的 vswprintf() 在小缓冲区而不是 EOF 上崩溃。如何传递缓冲区大小【英文标题】:vswprintf() without buffer size crashes on small buffer instead of EOF. How to pass buffer size 【发布时间】:2016-01-28 00:22:03 【问题描述】:

使用 Borland C++ Builder 2009

我根据 RAD Studio 的帮助 (F1) 使用 vswprintf :

int vswprintf(wchar_t *buffer, const wchar_t *format, va_list arglist); 

到目前为止,我一直提供大缓冲区wchar_t OutputStr[1000] 并且从未遇到任何问题。作为一个测试并且想要做一个改进操作,我尝试了一个小缓冲区wchar_t OutputStr[12] 并注意到程序完全崩溃了。甚至trycatch(...) 也没有抓住它。 Codeguard 报告 memcpy() 失败,这似乎是内部实现。我原本期望 EOF 作为返回值。

在线搜索vswprintf 时,我发现 c++ 变体将缓冲区大小作为输入,但我似乎无法说服我的编译器使用该变体? 知道如何使用 BCB2009 强制它吗?

练习的全部目的是实现一个回退方案,当缓冲区在可能的一两个异常情况下太小时,这样我就可以为函数分配更多内存并重试。但这种机制似乎根本不起作用。

不确定如何最好地测试所需的字节/字符的确切数量?

【问题讨论】:

所有非缓冲区大小指定的sprintf...函数都有这个问题。该函数无法知道实际的缓冲区大小,因此当它们超过它时,它们无法raise() 一个错误。 或许可以试试_vsnwprintf @M.M _vsnwprintf 有效。谢谢 !知道如何检查缓冲区太小需要多少字节/字符吗? vsnwprintf_s 本来会很好,但它不包含在 c++Builder 2009 中 @Peter 用0 调用它的大小应该返回所需的大小,而不需要写任何东西 @M.M 我试过了,但它不起作用。 MS 在线文档也没有提到它。 (msdn.microsoft.com/en-us/library/1kt27hek.aspx) 【参考方案1】:

您可以使用vswprintf_s。失败时返回负值

【讨论】:

听起来和我需要的完全一样,但BCB2009似乎不知道这个功能?这是在以后的版本中添加的吗? (包括stdio.h 对。 The Secure C Library 在 C++Builder 2010 中添加 _vsnwprintf 似乎可以解决问题。现在找出我需要多少字节/字符以防缓冲区不够大... @Peter _vsnwprintf 如果 nsize 为 0,则返回所需的字节数,不包括终止 '\0' 字符。 恐怕不行。不是根据我的测试(返回 -1),也不是根据 MS 文档(msdn.microsoft.com/en-us/library/1kt27hek.aspx)

以上是关于没有缓冲区大小的 vswprintf() 在小缓冲区而不是 EOF 上崩溃。如何传递缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章

循环缓冲区在第 6 个元素之后没有给出正确的缓冲区大小

字节缓冲区的大小和形状不匹配(以前没有回答)

更改与 HDC 关联的位图大小后,有没有办法更新 Graphics 对象?

StreamWriter 的默认缓冲区大小是多少

顶点和纹理坐标的缓冲区大小不同?

对缓冲区大小施加限制