【问题标题】:Determining size of vsprintf output确定 vsprintf 输出的大小
【发布时间】:2018-09-16 01:35:07
【问题描述】:

我正在为一个类实现一个类似printf(const char * format, ...) 的方法,在调用vsprintf() 执行之前,我需要确定它的输出的确切大小,仅给出提供的formatva_list 中给出的参数实际写作。

有没有一个函数可以使用formatva_list 来生成输出的确切长度?

【问题讨论】:

  • va_list 非常容易出错,因为它会让用户在期望整数时通过大象而不表示任何失败,而是进入UDB的土地,通常结果非常糟糕。它完全依赖于类型和大小假设的格式说明符,并且相当于 reinterpret_cast。如果您在 C++ 商店,我强烈建议您使用更安全的方法来达到您的目的。这些 C-isms 的存在是为了向后兼容。不要用 void 指针滥用和 UDB 污染你闪亮的新代码
  • @ChristopherPisz 如果您不知道如何正确执行,那么每个代码都以某种方式容易出错。你有更好的建议如何在没有可变参数的情况下使用它?
  • @πάνταῥεῖ 容易出错,然后完全忽略类型安全。但是,我认为在runtime 中并非所有事情都容易出错,即使您没有正确使用它。编译时间,当然……这是我们的目标,在修复成本最低的时候捕获错误。 ||你要我提议什么?除了提供一种使用可变参数列表的方法之外,OP 没有提及他的实际目标。我告诉他他不应该。对于另一种解决方案,他需要解释他为什么要这样做,他认为他会通过什么样的事情,以及他将如何处理这些事情。
  • @ChristopherPisz - 我的目标是为记录调试消息的类编写类似 printf() 的方法。我喜欢 printf() 的感觉和灵活性,它实际上正在取代我非常不喜欢的像
  • @Christohper << 运算符风格有很多缺点和缺陷,让方便的国际翻译只需要不同的词位。否则就不需要The Boost Format library

标签: c++ visual-studio-2015 printf


【解决方案1】:

example in the documentation 开始,您可以确定必要的缓冲区大小 1st(强调我的):

std::vector<char> buf(1+std::vsnprintf(NULL, 0, fmt, args1)); // <<<
va_end(args1);
std::vsnprintf(buf.data(), buf.size(), fmt, args2);

4) 将结果写入字符串缓冲区。最多写入 buf_size-1 个字符。结果字符串将以空字符终止,除非 buf_size 为零。如果 buf_size 为零,则不写入任何内容并且缓冲区可能是空指针,但仍会计算并返回返回值(将写入的字节数,不包括空终止符)

如果目标缓冲区参数作为NULLnullptr 传递,则通常可以使用&lt;x&gt;sprintf() 函数系列的所有变体来计算必要的缓冲区大小。

【讨论】:

  • @HenriMenke 我只是引用 cppreference 文档中的示例,请在那里投诉。
  • @HenriMenke 我相信这很清楚,在这种情况下,您的挑剔是次要的。
猜你喜欢
  • 2012-04-09
  • 2018-07-02
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2011-04-03
  • 1970-01-01
相关资源
最近更新 更多