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