代码之家  ›  专栏  ›  技术社区  ›  shoosh

从MSVC2008上失败的vsnprintf中优雅地恢复

  •  2
  • shoosh  · 技术社区  · 14 年前

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

    到目前为止,我发现 vsnprintf()。 当缓冲区太小时,它的变量会自动截断字符串,但是它们 不返回实际长度 所以我不能用更长的缓冲区再试一次。他们返回-1。

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

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

    最终会打电话给 _CrtDbgReportW() ,可能只在调试中。 即使在调用用户提供的“无效参数处理程序”之前,它们也会执行此操作。

    我只想得到我需要分配的实际大小,然后再次调用函数,从而能够在没有用户交互的情况下恢复。有可能吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Peter Ruderman    14 年前

    您要查找的函数是\uvscprintf(或\uvscwprintf)。它们返回所需的字符数,而不实际格式化任何内容。

        2
  •  0
  •   philcolbourn    14 年前

    如果在 n 你就知道 n 写了个字符。

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

    所以,返回值就是您需要的缓冲区的大小。

    如果你准备好了 n=0 ,不会写任何东西,但是 VSN打印 会告诉你缓冲区需要多大。

    (我刚刚重新阅读了 VSN打印 Doc,您需要为返回值添加1个字节 NUL )