【问题标题】:Formatting a string of unknown length in C++ [duplicate]在C ++中格式化未知长度的字符串[重复]
【发布时间】:2016-10-05 11:00:49
【问题描述】:

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

我想要做的是类似的事情

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

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

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

【问题讨论】:

  • Boost 有这样的东西,但标准 C++ 没有。但是,您可以使用 operator + 连接字符串(std::strings,即不是旧的字符串文字)。
  • 您现在应该已经遇到了<< 运算符。 << 用于格式化任意大小和参数的字符串。
  • 使用std::ostringstream
  • 看看这个答案是否有帮助stackoverflow.com/questions/12233710/…
  • @BaummitAugen 我看到很多东西都提到了 boost,这是推荐用于 C++ 开发的东西

标签: c++ string


【解决方案1】:

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

例子:

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

【讨论】:

    【解决方案2】:

    获取 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 和 C++ 混淆,因为它们在某些地方有些相似。我去了字符串流。
    【解决方案3】:

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

    请注意,对于整数、字符串和实数的基本输出,printf() 格式很方便且易于使用,但它们不能扩展到用户定义的对象,因为没有公认的编写 toString() 方法的方法并在调用后销毁字符串。他们也不能处理对象数组。有一个公认的约定是重载

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 2019-09-02
      • 2021-10-07
      • 2018-08-10
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 2013-12-10
      相关资源
      最近更新 更多