我正在寻找一种方法来使用vsnprintf()
的某个变体,其缓冲区可能比输入缓冲区长,而不会向用户触发错误。
到目前为止,我发现vsnprintf()
及其变体在缓冲区太小时会静默截断字符串,但是不会返回字符串的实际长度,所以我可以再试一次使用更长的缓冲区。他们返回-1。
另一方面,vsnprintf_s()
变体在遇到此错误时调用
_VALIDATE_RETURN(("Buffer too small", 0), ERANGE, -1);
反过来最终调用_CrtDbgReportW()
,可能只在调试中。
他们甚至在调用用户提供的“无效参数处理程序”
我想要的是通过获取我需要分配的实际大小并再次调用该函数,能够在没有用户交互的情况下进行恢复。那可能吗?
答案 0 :(得分:2)
您正在寻找的功能是_vscprintf(或_vscwprintf)。这些返回所需的字符数而不实际格式化任何内容。
答案 1 :(得分:0)
如果在n
中提供输出缓冲区的长度,则表示您已写入不超过n
个字符。
vsnprintf
返回缓冲区足够长时可写入的字符数。
因此,返回值是您需要的缓冲区大小。
如果设置n=0
,则不会写入任何内容,但vsnprintf
会告诉您缓冲区需要多大。
(我刚刚重新阅读了vsnprintf
doc,你需要在NUL
的返回值中添加1个字节。)