【问题标题】:Simple C++ string formatting under GCC [duplicate]GCC下的简单C++字符串格式化[重复]
【发布时间】:2011-06-15 13:09:59
【问题描述】:

我正在将其他人的 C++ 库转换为在 GCC (Xcode) 下工作。字符串格式化的基本方法是什么?

编辑:我看到我的问题的原始措辞引起了很多混乱,更不用说一些娱乐了。我需要做的是替换他们库中的某些字符串格式化函数。他们已经通过 wxString 完成了格式化,我不想将其包含在我的项目中——我知道它适用于 Xcode,但这对于我需要做的简单格式化来说似乎是一种大锤式的方法。它们具有获取对象并输出字符串的函数——通常是 (char*),我需要创建相同的 (char*) 输出 [然后可能会转到库中的另一个对象;不一定对用户],但以不使用 wxString 的方式进行。我宁愿避免把它变成C++。在 Objective-C 中,我一直使用 NSString 的 stringWithFormat: 方法来执行此操作。显然我不想使用任何 NSString 方法,也不想创建 NSStrings。创建 (char*) 或 C++ 字符串会很好。不,这不是一个虚假的事实,也不是功课。

【问题讨论】:

  • 他要求与 C++ 中的代码等效...
  • @Neil 如果是 C++ 代码,我怀疑他不会问这个问题。他正在寻找如何将 Objective-C 转换为 C++。
  • 他说他正在转换别人的 C++ 库。
  • @Tony 他说someone else's _c++_ library
  • @Jonathan:出于好奇,“虚假事实”的例子是什么? :-)

标签: c++ string formatting


【解决方案1】:

您可以使用流:

std::stringstream ss;

ss << somedouble << someint;

【讨论】:

  • 嘿嘿,打败我吧! :)
  • 他的格式是科学双精度(%g)。我认为您的示例会进行不同的转换。
  • @Vlad,我想他必须创建自定义 operator &lt;&lt;operator &gt;&gt; 重载
  • @Tony:我认为这没有必要,因为有 std::hex 等流格式修饰符。
  • @phresnel:对。我只是说提供精确的等价物会好得多。 Dude 根本不知道 I/O 流或 C++,所以......我个人几乎从不使用 C++ i/o 流,因为我坚信它们很烂,所以我不能从头顶抛出任何例子.
【解决方案2】:

可以使用 printf 系列函数,但在 99.99% 的情况下,这是非常不受欢迎的。

查看 Tony The Tiger 的回答。


编辑:好的。为什么对格式字符串皱眉。

  • 您如何从某个 3rd 方 C++ 库中打印出您自己的类型或类型?与 printf 不同,流是可扩展的:

    cout &lt;&lt; foo &lt;&lt; '\n';

    对比

    printf("%s: %f %f %f / scc(%d)\n",
     foo.name(),
     foo.height(), foo.width(), foo.depth(),
     foo.sampleCount());
  • 哦,废话,将非 POD 类型传递给可变参数会产生未定义的行为;猜猜foo.name() 的返回类型是什么?有趣的是,它编译得很好,并且根据实现的不同,甚至可能出于某种奇怪的原因工作。

  • 过了一会儿,我开始使用我自己的非原始Decimal-实现,被foo.width()/height()/depth()用作返回类型。废话,现在我仅在该行中调用了 4 次未定义的行为。

  • 如何避免格式字符串冗余?我应该像这样外化打印吗:

printf("foo 是:");
   printFoo(标准输出);
   printf("\n");
  • 最后,我度过了糟糕的一天和糟糕的夜晚。我输入:float f; fscanf(stdout, "%c %f", f); -> 请找出所有错误。

【讨论】:

  • 皱眉... . 如果你知道你正在处理什么数据类型,那么快速使用*printf 可以成为你的救命稻草。
  • @Kerrek SB:来吧...与 printf 不同,流是可扩展的:MyAwesomeFoo foo, bar; cout &lt;&lt; foo &lt;&lt; '\n';printf ("%s: %f %f %f / scc(%d)\n", foo.name(), foo.height(), foo.width(), foo.depth(), foo.sampleCount()); 更糟糕,真的吗?
  • @Kerrek SB:b)哦,废话,将非 POD 类型传递给可变参数会产生未定义的行为;猜猜 foo.name() 的返回类型是什么?有趣的是,它甚至是编译器,并且取决于实现,甚至可能出于某种奇怪的原因工作。
  • @Kerrek SB: c) 过了一会儿,我开始使用自己的非原始十进制实现,被 foo.width()/height()/depth 用作返回类型()。废话,现在我仅在该行中调用了 4 次未定义的行为。
  • @Kerrek SB: d) 如何避免格式字符串冗余?我应该像这样外化打印:printf("foo is:"); printFoo (stdout); printf("\n");。多么不乏味。
【解决方案3】:

sprintf() 是一个很好的起点。但是,这实际上取决于您不想实现的目标。正如 Tony The Tiger 指出的那样,std::stringstream 是一个不错的选择,Boost.Format 是另一个选择。

【讨论】:

    【解决方案4】:

    在 C++ 中有很多方法可以做到这一点。例如:

    char str[256];
    snprintf (str, sizeof (str), "%g %d %s", someDouble, someInteger, someString);
    

    您也可以直接打印到某些输出流,使用 C++ I/O 流,甚至达到Boost.LexicalCast 的程度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-24
      • 2011-07-22
      • 1970-01-01
      • 2018-08-10
      • 2015-01-07
      • 2016-04-13
      • 2011-05-17
      • 2014-09-24
      相关资源
      最近更新 更多