从msvc2008上失败的vsnprintf恢复graceflly

时间:2010-03-24 13:45:16

标签: c++ printf visual-c++-2008

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

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

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

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

反过来最终调用_CrtDbgReportW(),可能只在调试中。 他们甚至在调用用户提供的“无效参数处理程序”

之前就这样做了

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

2 个答案:

答案 0 :(得分:2)

您正在寻找的功能是_vscprintf(或_vscwprintf)。这些返回所需的字符数而不实际格式化任何内容。

答案 1 :(得分:0)

如果在n中提供输出缓冲区的长度,则表示您已写入不超过n个字符。

vsnprintf返回缓冲区足够长时可写入的字符数。

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

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

(我刚刚重新阅读了vsnprintf doc,你需要在NUL的返回值中添加1个字节。)