3

哪个更好:boost::format还是sprintf?我也想知道哪一种更安全。

我知道sprintf它格式化char[]对象的一个​​限制,并且 的大小char[]应该足以容纳格式化的字符串。但boost::format也有同样的限制与否。任何人都可以在网上指出我的一个文档,我会参考 和 之间的boost::format区别sprintf

4

3 回答 3

6

在健壮性和类型安全方面 boost::format 是明显的赢家。它没有缓冲区大小的问题,因为它使用动态流。参数的类型保留在函数调用中,因此格式化程序可以智能转换。这也意味着不存在用不匹配的类型搞砸堆栈的问题。此模型中还提供类型转换。

格式的缺点是速度快,而且有点麻烦。对于 sprintf 可以处理的格式,它的速度比 sprintf 低很多。它的语法也比快速调用 sprintf 更复杂一些。

对于简单的标记格式化,我通常使用 sprintf。对于复杂的字符串格式,我倾向于使用 boost 格式或 iostreams。

于 2012-06-13T05:53:23.427 回答
2

sprintf()不是类型安全的;因此boost::format将更加类型安全。 sprintf()容易出现缓冲区溢出;你最好使用snprintf()than sprintf(),但你很可能仍然使用boost::format.

于 2012-06-13T05:50:43.633 回答
1

这取决于您如何定义“更好”。

printf作为标准库的一部分,它非常快速且易于使用。然而,它具有在某种程度上通过GCC 中的__attribute__ ((format (printf, ...))解决的安全问题。

Boost 格式是安全的,但它要慢得多,并且正如 指出的那样@edA-qa mort-ora-y,由于非常规使用operator%.

如果您想要两全其美,方便的函数调用格式化 API 和printfBoost 格式的速度以及安全性,请考虑{fmt}库。它同时支持printfPython 的str.format语法:

fmt::print("Hello, {}!", "world");  // uses Python-like format string syntax
fmt::printf("Hello, %s!", "world"); // uses printf format string syntax

免责声明:我是 {fmt} 的作者

于 2015-02-13T02:07:22.257 回答