哪一個更好:boost::format
or sprintf
? 我也想知道哪一個更安全使用。boost :: format vs sprintf
我知道sprintf
的一個限制,它格式化一個char[]
對象,並且char[]
的大小應該足以容納格式化的字符串。但boost::format
是否也有相同的限制。任何人都可以指出我在網上的文檔,我會參考boost::format
和sprintf
之間的差異。
哪一個更好:boost::format
or sprintf
? 我也想知道哪一個更安全使用。boost :: format vs sprintf
我知道sprintf
的一個限制,它格式化一個char[]
對象,並且char[]
的大小應該足以容納格式化的字符串。但boost::format
是否也有相同的限制。任何人都可以指出我在網上的文檔,我會參考boost::format
和sprintf
之間的差異。
就穩健性和類型安全性而言,boost :: format是一個明顯的贏家。它沒有緩衝區大小問題,因爲它使用動態流。參數的類型保留在函數調用中,因此格式化程序可以進行智能轉換。這也意味着沒有使用不匹配的類型擰入堆棧的問題。類型轉換也可在此模型中使用。
格式的缺點是速度快,而且有點麻煩。它的速度比sprintf可以處理的格式要低很多。它的語法也比快速調用sprintf更復雜一些。
對於簡單的令牌格式我通常使用sprintf。對於複雜的字符串格式化,我傾向於使用boost格式或iostreams。
sprintf()
不是類型安全的;因此boost::format
將更安全。 sprintf()
容易發生緩衝區溢出;你最好使用snprintf()
比sprintf()
,但你很可能會更好,但仍然boost::format
。
這取決於你如何定義「更好」。
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++格式的作者
我建議在看看[文章](http://www.gotw.ca/出版物/ mill19.htm)。它並沒有專門討論boost :: format,但涵蓋了'sprintf'並與其他方法進行了比較。 – juanchopanza