哪一个更好:boost::format
或sprintf
?
我也想知道哪一种更安全使用。
我知道sprintf
的一个限制是它格式化char[]
个对象,char[]
的大小应足以容纳格式化的字符串。但boost::format
是否也有同样的限制。任何人都可以在网上向我指出一份文件,我将参考boost::format
和sprintf
之间的差异。
答案 0 :(得分:6)
在稳健性和类型安全性提升方面::格式是一个明显的赢家。它没有缓冲区大小的问题,因为它使用动态流。参数的类型保留在函数调用中,因此格式化程序可以智能地转换。这也意味着不存在使用不匹配类型拧紧堆栈的问题。此模型中也提供类型转换。
格式的缺点是它的速度和它有点麻烦。对于sprintf可以处理的格式,它的速度比sprintf的速度要低很多。它的语法也比快速调用sprintf更复杂。
对于简单的令牌格式,我通常使用sprintf。对于复杂的字符串格式化,我倾向于使用boost格式或iostreams。
答案 1 :(得分:2)
sprintf()
不是类型安全的;因此boost::format
将更加类型安全。 sprintf()
容易出现缓冲区溢出;你最好使用snprintf()
而不是sprintf()
,但使用boost::format
时,你很可能会更好。
答案 2 :(得分:1)
这取决于你如何定义"更好"。
printf
非常快速且随时可用作标准库的一部分。但是,它有一些安全问题,在某种程度上可以通过GCC中的__attribute__ ((format (printf, ...))解决。
Boost格式是安全的,但它是much slower,正如@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}
的作者