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

Formatting a string of unknown length in C++

本文关键字:字符串 未知 c++ 格式化      更新时间:2023-10-16

我目前正在学习c++,我找不到如何创建一个字符串与格式化器采取多个参数,如使用sprintf,但未知的字符串长度。

我要做的是像

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

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

我所看到的关于c++和字符串格式化的一切都需要定义一个固定长度的字符数组并使用sprintf,但是我不知道字符串的长度,所以我不能这样做。

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

的例子:

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

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

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

请注意,printf()格式对于整数、字符串和实数的基本输出是方便且易于使用的,但它们不能扩展到用户定义的对象,因为没有可接受的方法来编写toString()方法并在调用后销毁字符串。它们也不能处理对象数组。重载<<将对象的文本表示形式写入流。