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

时间:2011-06-15 13:10:00

标签: c++ string formatting

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

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

4 个答案:

答案 0 :(得分:5)

您可以使用流:

std::stringstream ss;

ss << somedouble << someint;

答案 1 :(得分:2)

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

见Tony The Tiger的答案。


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

  • 如何从某些第三方C ++库中打印自己的类型或类型?与printf不同,流是可扩展的:

    cout << foo << '\n';

    vs

    printf ("%s: %f %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); - &gt;请查找所有错误。

答案 2 :(得分:1)

sprintf()是一个很好的起点。但是,它实际上取决于您想要实现的目标。 {@ 1}}是托尼老虎指出的一个很好的选择,Boost.Format是另一个。

答案 3 :(得分:1)

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

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

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