哪个更好:boost::format
还是sprintf
?我也想知道哪一种更安全。
我知道sprintf
它格式化char[]
对象的一个限制,并且 的大小char[]
应该足以容纳格式化的字符串。但boost::format
也有同样的限制与否。任何人都可以在网上指出我的一个文档,我会参考 和 之间的boost::format
区别sprintf
。
在健壮性和类型安全方面 boost::format 是明显的赢家。它没有缓冲区大小的问题,因为它使用动态流。参数的类型保留在函数调用中,因此格式化程序可以智能转换。这也意味着不存在用不匹配的类型搞砸堆栈的问题。此模型中还提供类型转换。
格式的缺点是速度快,而且有点麻烦。对于 sprintf 可以处理的格式,它的速度比 sprintf 低很多。它的语法也比快速调用 sprintf 更复杂一些。
对于简单的标记格式化,我通常使用 sprintf。对于复杂的字符串格式,我倾向于使用 boost 格式或 iostreams。
sprintf()
不是类型安全的;因此boost::format
将更加类型安全。 sprintf()
容易出现缓冲区溢出;你最好使用snprintf()
than sprintf()
,但你很可能仍然使用boost::format
.
这取决于您如何定义“更好”。
printf
作为标准库的一部分,它非常快速且易于使用。然而,它具有在某种程度上通过GCC 中的__attribute__ ((format (printf, ...))解决的安全问题。
Boost 格式是安全的,但它要慢得多,并且正如 指出的那样@edA-qa mort-ora-y
,由于非常规使用operator%
.
如果您想要两全其美,方便的函数调用格式化 API 和printf
Boost 格式的速度以及安全性,请考虑{fmt}库。它同时支持printf
Python 的str.format
语法:
fmt::print("Hello, {}!", "world"); // uses Python-like format string syntax
fmt::printf("Hello, %s!", "world"); // uses printf format string syntax
免责声明:我是 {fmt} 的作者