在C ++中格式化未知长度的字符串

时间:2016-10-05 11:00:49

标签: c++ string

我目前正在学习C ++,但是我找不到如何使用格式化程序创建一个字符串来获取多个参数,例如使用sprintf但是未知的字符串长度。

我想要的是

string myString = string.format("Hello, here is %s %s and another %s", par1, par2, par3);

我知道在C中有asprintf函数,它可以计算出字符串的长度以及malloc的内存,你需要在完成时释放它,然而,这似乎并不是可用于C ++,尽管sprintf是。我在google上看到的关于asprintf的一切似乎主要集中在Linux上,而我需要跨平台。

我所看到的关于C ++和字符串格式化的所有内容你需要定义一个固定长度的char数组并使用sprintf,但我不会知道字符串的长度所以我不能这样做。

3 个答案:

答案 0 :(得分:1)

获取Josuttis的标准C ++库。它将为您提供完整的字符串界面以及更多功能。你似乎在想C,而不是C ++。您当然可以使用像sprintf()这样的C接口来加载 char []然后将其复制到C ++字符串。这通常是一个坏主意。

Two ways to do what you ask:
string myString("Hello, here is ");
myString += par1;
myString += " ";
myString += par2;
myString += " and another ";
myString += par3;

stringstream foo;
foo << "Hello, here is " << par1 << " " << par2 << " and another " << par3;
string myString(foo.str());

答案 1 :(得分:1)

除了现有的优秀答案外,您还可以考虑使用Boost Format库。

示例:

std::string myString = str(boost::format("Hello, here is %s %s an another %s") % par1 % par2 % par3);

答案 2 :(得分:1)

有很多答案。 由于C ++字符串变得很长,您希望使用std :: stringstream来构建它们。这允许您像写入内存中的文件一样写入字符串,并且编写它以有效地处理非常大的字符串。 C函数snprintf()返回传递空指针时将写入的字符数。所以你需要调用它两次,一次获得大小,然后分配缓冲区并再次调用格式化。对于预期非常短且具有定义格式的字符串来说,这是一个很好的解决方案,但可能会任意变长,就像包含某人姓名的字符串一样。

请注意,printf()格式方便且易于用于整数,字符串和实数的基本输出,但它们不能扩展到用户定义的对象,因为没有可接受的编写toString()方法的方法并在通话后销毁字符串。它们也无法处理对象数组。有一个公认的约定,即重载&lt;&lt;将对象的文本表示写入流。