GCC下的简单C++字符串格式

Simple C++ string formatting under GCC

本文关键字:字符串 格式 C++ 简单 GCC      更新时间:2023-10-16

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

编辑:我看到我的问题最初的措辞引起了很多困惑,更不用说一些娱乐了。我需要做的是替换库中的某些字符串格式化函数。他们已经通过wxString进行了格式化,我不想把它包括在我的项目中——我知道它适用于Xcode,但对于我需要做的简单格式化来说,这似乎是一种大锤式的方法,并且我需要创建相同的(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/scc(%d)\n",foo.name(),foo.height()、foo.width()、foo.depth(),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);->请查找所有错误

sprintf()是一个很好的起点。然而,这真的取决于你不想实现什么。正如Tony The Tiger所指出的,std::stringstream是一个很好的选择,Boost。格式是另一种。

在C++中有很多方法。例如:

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

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

的程度