[英]Simple C++ string formatting under GCC
我正在將別人的C ++庫轉換為在GCC( Xcode )下工作。 字符串格式化的基本方法是什么?
編輯:我看到我的問題的原始措辭引起了很多混亂,更不用說一些娛樂了。 我需要做的是替換其庫中的某些字符串格式化功能。 他們已經通過wxString進行了格式化,我不想在我的項目中包括它-我知道Xcode已經存在了,但是對於我需要做的簡單格式化來說,這似乎是一種大錘式方法。 它們具有帶走對象並吐出字符串的函數-通常為(char *),我需要創建相同的(char *)輸出[然后可能會轉到庫中的另一個對象; ],但不必使用wxString。 而且我寧願避免將其轉換為C ++。 在Objective-C中,我始終使用NSString的stringWithFormat:方法進行此操作。 顯然,我不想使用任何NSString方法,也不想創建NSString。 創建(char *)或C ++字符串就可以了。 不,這不是錯誤的事實,也不是家庭作業。
您可以使用流:
std::stringstream ss;
ss << somedouble << someint;
您可以使用printf系列函數,但是在99.99%的情況下,由於非常充分的理由,對此不以為然。
參見托尼老虎的答案。
編輯:好的。 為什么皺眉格式字符串。
如何從某些第三方C ++庫中打印自己的類型? 與printf不同,流是可擴展的:
cout << foo << '\\n';
與
printf(“%s:%f%f%f / scc(%d)\\ n”, \n foo.name(), \n foo.height(),foo.width(),foo.depth(),\n foo.sampleCount());
糟糕,將非POD類型傳遞給varargs會產生不確定的行為; 猜猜foo.name()
的返回類型是什么? 有趣的是,它可以很好地編譯,並且根據實現的不同,甚至可能出於某些奇怪的原因而工作。
一段時間后,我開始使用自己的非原始Decimal
實現,被foo.width()/height()/depth()
用作返回類型。 胡扯,現在我僅在該行中調用4次未定義的行為。
如何避免格式字符串冗余? 我應該像這樣外部化打印:
printf("foo is:"); printFoo (stdout); printf("\n");
float f; fscanf(stdout, "%c %f", f);
float f; fscanf(stdout, "%c %f", f);
->請找出所有錯誤。 sprintf()
是一個很好的起點。 但是,這實際上取決於您不希望實現什么。 正如Tony The Tiger所指出的那樣, std::stringstream
是一個很好的選擇, Boost.Format是另一個。
用C ++可以有很多方法。 例如:
char str[256];
snprintf (str, sizeof (str), "%g %d %s", someDouble, someInteger, someString);
您還可以直接打印到某些輸出流,使用C ++ I / O流,甚至達到Boost.LexicalCast的程度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.