2012-06-13 53 views
2

哪一個更好:boost::format or sprintf? 我也想知道哪一個更安全使用。boost :: format vs sprintf

我知道sprintf的一個限制,它格式化一個char[]對象,並且char[]的大小應該足以容納格式化的字符串。但boost::format是否也有相同的限制。任何人都可以指出我在網上的文檔,我會參考boost::formatsprintf之間的差異。

+1

我建議在看看[文章](http://www.gotw.ca/出版物/ mill19.htm)。它並沒有專門討論boost :: format,但涵蓋了'sprintf'並與其他方法進行了比較。 – juanchopanza

回答

6

就穩健性和類型安全性而言,boost :: format是一個明顯的贏家。它沒有緩衝區大小問題,因爲它使用動態流。參數的類型保留在函數調用中,因此格式化程序可以進行智能轉換。這也意味着沒有使用不匹配的類型擰入堆棧的問題。類型轉換也可在此模型中使用。

格式的缺點是速度快,而且有點麻煩。它的速度比sprintf可以處理的格式要低很多。它的語法也比快速調用sprintf更復雜一些。

對於簡單的令牌格式我通常使用sprintf。對於複雜的字符串格式化,我傾向於使用boost格式或iostreams。

2

sprintf()不是類型安全的;因此boost::format將更安全。 sprintf()容易發生緩衝區溢出;你最好使用snprintf()sprintf(),但你很可能會更好,但仍然boost::format

0

這取決於你如何定義「更好」。

printf作爲標準庫的一部分相當快速且容易獲得。然而,它有安全問題,在一定程度上解決了GCC中的__attribute__ ((format (printf, ...))

升壓格式是安全的,但它是much slower,正如@edA-qa mort-ora-y所指出的,由於非常規使用operator%而使用起來有些麻煩。

如果您想要兩全其美,方便的函數調用格式API和速度printf以及Boost格式的安全性,請考慮C++ Format庫。它同時支持printf和Python的str.format語法:

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

免責聲明:我是C++格式的作者