【问题标题】:How do I send a format string to iostream? [duplicate]如何将格式字符串发送到 iostream? [复制]
【发布时间】:2012-09-25 18:30:19
【问题描述】:

可能重复:
std::string formatting like sprintf

我可以将 c++ iostream 类与 printf 之类的格式字符串一起使用吗?

基本上,我希望能够做类似的事情:-

snprintf (inchars, len, "%4f %6.2f %3d \n", float1, float2, int1);

轻松使用字符串流。是否有捷径可寻?

【问题讨论】:

  • 标准 C++ 格式更加冗长,遗憾的是。你会想要一个图书馆。

标签: c++ iostream format-string


【解决方案1】:

是的,有Boost Format Library(内部是字符串流)。

Example:

#include <boost/format.hpp>
#include <iostream>

int main() {
  std::cout << boost::format("%s %s!\n") % "Hello" % "World";
  return 0;
}

【讨论】:

  • 哇,多么糟糕的语法……
  • 这看起来会起作用......虽然我会坚持一段时间,希望有一个更好的解决方案,语法更简洁。
  • 你已经习惯了......但是,由于这种方法,在极少数情况下你会遇到运算符优先级问题。
  • %的使用可能是受到python的启发
【解决方案2】:

您可以编写一个包装函数,该函数返回您可以传递到 ostringstream 中的内容。

这个函数结合了cmets中指出的linkmoooeeeep中提出的一些解决方案:

std::string string_format(const char *fmt, ...) {
    std::vector<char> str(100);
    va_list ap;
    while (1) {
        va_start(ap, fmt);
        int n = vsnprintf(&str[0], str.size(), fmt, ap);
        va_end(ap);
        if (n > -1 && n < str.size()) {
            str.resize(n);
            return &str[0];
        }
        str.resize(str.size() * 2);
    }
}

【讨论】:

  • 不错。这是一个可以玩的链接:ideone.com/23xIY
  • 我刚刚发现了一个缺点:当你传入一个与提供的参数不匹配的格式字符串时,你会得到相当不确定的错误,从打印的垃圾到分段错误。 boost::format 提供了一个有用的错误信息。看到这个:ideone.com/63BK1
  • @moooeeeep:GCC 提供了一个扩展属性,可以警告 printf 参数不匹配的参数 (__attribute__((format(...))))。
【解决方案3】:

这种格式使用标准 C++ 流需要更多的努力。特别是,您必须使用stream manipulators,它可以指定小数点后显示的位数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多