【问题标题】:Preferred method for string formatting in c++? [duplicate]c++中字符串格式化的首选方法? [复制]
【发布时间】:2014-12-11 01:30:55
【问题描述】:

这对我来说有点冗长:

ostrstream ss;
ss << "Selected elements: " << i << "," << j << ".";
string msg(ss.str(), (size_t)ss.pcount());

是否有一种优雅的方式来使用简洁的单行语句(可能带有模板或宏)来格式化文本消息?

【问题讨论】:

  • 您可以查看 boost 格式:boost.org/doc/libs/1_55_0/libs/format
  • @Adrian:谢谢,这正是我想要的
  • 是的,Boost.Format 就是答案。
  • @πάντα ῥεῖ 呃,这个问题及其答案太可怕了。我希望你没有关闭它;我刚刚要提交一个很好的答案,并为 this OP 的特定问题提供一个很好的例子。 叹息。哦,好吧。

标签: c++ string-formatting


【解决方案1】:

是的;你在找Boost.Format:

const int i = 3, j = 4;
const std::string msg = (boost::format("Selected elements: %d %d") % i % j).str();

(live demo)

【讨论】:

    【解决方案2】:

    您最有可能寻找的是sprintf,它的作用类似于 printf,但返回一个 cstring。 因此您的代码将是
    string msg(sprintf( "Selected elements: %d, %d.", i, j ) )

    编辑

    看起来我没有阅读我自己的链接。所以你又有一个三行代码。您总是可以定义以下内容

    std::string itostr( int i )
    {
        char temp[20];
        std::sprintf( temp, "%d" i);
        std::string out(temp);
        return out;
    }
    

    然后你可以使用 + 运算符来连接字符串。

    string msg("Selected elements: " + itostr(i) + "," + itostr(j) + ".");
    

    【讨论】:

    • 这行不通。 sprintf 在其第一个参数中输出结果。这里你的第一个参数是格式字符串。这应该是一个常数。
    • std::sprintf() 是我能想到的最糟糕的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2014-11-02
    • 2013-07-09
    • 1970-01-01
    • 2021-05-09
    相关资源
    最近更新 更多