簡體   English   中英

GCC下的簡單C ++字符串格式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM