2012-09-25 44 views
2

可能重複:
std::string formatting like sprintf如何向iostream發送格式字符串?

我可以使用C++ iostream類與格式字符串如printf?

基本上,我希望能夠做一些事情,如: -

snprintf (inchars, len, "%4f %6.2f %3d \n", float1, float2, int1); 

容易使用stringstreams。是否有捷徑可尋?

+1

標準C++格式是更詳細的,可悲的。你會想要一個圖書館。 –

回答

5

是的,有Boost Format Library(這是內部的stringstreams)。

Example:

#include <boost/format.hpp> 
#include <iostream> 

int main() { 
    std::cout << boost::format("%s %s!\n") % "Hello" % "World"; 
    return 0; 
} 
+5

哇,多麼可怕的語法... –

+0

這看起來像它會工作...雖然我會堅持一段時間希望更清晰的語法更好的解決方案。 – owagh

+0

您已經習慣了...但是,由於這種方法,在極少數情況下,您可能因運算符優先級而出現問題。 – moooeeeep

0

這種格式的需要使用標準的C++流相當多付出更多的努力。尤其是,您必須使用stream manipulators,它可以指定小數點後顯示的位數。

2

您可以編寫一個包裝函數,它返回可以傳遞給ostringstream的東西。

此功能將在評論一些在link moooeeeep提出的解決方案指出:

std::string string_format(const char *fmt, ...) { 
    std::vector<char> str(100); 
    va_list ap; 
    while (1) { 
     va_start(ap, fmt); 
     int n = vsnprintf(&str[0], str.size(), fmt, ap); 
     va_end(ap); 
     if (n > -1 && n < str.size()) { 
      str.resize(n); 
      return &str[0]; 
     } 
     str.resize(str.size() * 2); 
    } 
} 
+1

的啓發。這裏有一個鏈接:http://ideone.com/23xIY – moooeeeep

+0

我剛剛發現了一個缺點:當你傳遞的格式字符串與提供的參數不匹配時,會得到非特定的錯誤,範圍從打印垃圾到分段故障。 boost :: format提供了一個有用的錯誤消息。看到這個:http://ideone.com/63BK1 – moooeeeep

+0

@moooeeeep:GCC提供了一個擴展屬性,它會向printf參數('__attribute __((format(...)))')發出不匹配的參數警告。 – jxh