繁体   English   中英

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

[英]Formatting a string of unknown length in C++

我目前正在学习C ++,找不到如何使用格式化程序创建字符串以采用多个参数(例如使用sprintf)但字符串长度未知的方法。

我想要做的是

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

我知道在C语言中有一个asprintf函数,它可以计算出字符串的长度,并且它是malloc的内存,并且您需要在完成时释放它,但是,尽管sprintf可以,但C ++似乎不可用。 我在Google上看到的有关asprintf的所有内容似乎都集中在Linux上,而我需要跨平台。

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

获得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());

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

例:

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

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

请注意,对于整数,字符串和实数的基本输出,printf()格式既方便又易于使用,但是它们无法按比例扩展到用户定义的对象,因为尚无公认的编写toString()方法和销毁方法的方法。通话后的字符串。 他们也不能处理对象数组。 有一个公认的约定,重载<<将对象的文本表示形式写入流中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM