2

我正在寻找一种方法来使用缓冲区的某些变体,vsnprintf()该缓冲区可能比输入缓冲区长,而不会向用户触发错误。

到目前为止,我发现它vsnprintf()及其变体在缓冲区太小时会静默截断字符串,但它们不会返回字符串的实际长度,因此我无法使用更长的缓冲区再次尝试。他们返回-1。

另一方面,vsnprintf_s()变体在遇到此错误时,调用

_VALIDATE_RETURN(("Buffer too small", 0), ERANGE, -1);

反过来最终调用_CrtDbgReportW(),可能仅在调试中。他们甚至在调用用户提供的“无效参数处理程序”之前就这样做了

我想要的是能够通过获取我需要分配的实际大小并再次调用该函数来在没有用户交互的情况下恢复。那可能吗?

4

2 回答 2

2

您要查找的函数是 _vscprintf(或 _vscwprintf)。这些返回所需的字符数,而无需实际格式化任何内容。

于 2010-03-24T14:12:04.940 回答
0

如果您在 中提供输出缓冲区的长度,那么您就知道写入的字符n数不超过。n

vsnprintf如果缓冲区足够长,则返回将写入的字符数。

因此,返回值是您需要的缓冲区大小。

如果设置n=0,则不会写入任何内容,但vsnprintf会告诉您缓冲区需要多大。

(我只是重新阅读了vsnprintf文档,您需要在返回值中添加 1 个字节NUL。)

于 2010-03-24T13:56:01.847 回答