【问题标题】:C++ ostream fill adding a trailing 0C++ ostream 填充添加尾随 0
【发布时间】:2018-04-17 02:29:28
【问题描述】:

您好,我在使用 C++ 中的 ostream 对象格式化输出时遇到问题。

ostream& write(ostream& os)
{
    os << os.fill('*') << os.width(10);
    return os;
}

这是输出的样子:

********* 0

我正在尝试达到 10 个*s,而没有尾随的0

尾随0的原因是什么?

我是否错误地使用了宽度和填充功能?

【问题讨论】:

  • 不是尾随0吗?
  • 小测验:第 1 部分:以下表达式的值是多少:os.fill('*'),这个表达式的计算结果是什么。第 2 部分:如果使用重载的 &lt;&lt; 运算符将此表达式的值写入 std::ostream 对象,会发生什么?
  • @NickyC 是的,这是我的错。
  • @SamVarshavchik 我会试试看的。

标签: c++ ostream setw


【解决方案1】:

正如ios::base::width 所说:

返回值:调用前的字段宽度值。

所以你正在做的是fill你的ostream*s,然后在调用之前打印字段的值0

还有一点你可能没有注意到,在0 之前,你有另一个字符,那是因为std::ios::fill 返回值:

返回值:调用前填充字符的值。

试试这个:

ostream& write(ostream& os)
{
    os.fill('*');
    os.width(10);
    return os;
}

【讨论】:

  • 或者,使用 I/O 操纵器而不是直接调用流方法:return os &lt;&lt; std::setfill('*') &lt;&lt; std::setw(10);
  • @RemyLebeau 实际上这是一个更好的主意,如果您将其发布为答案,我会支持它。
  • 只是为了确保我做对了。通过执行 os
  • @Devin 是的,这样您就不会将它们的返回值添加到您的ostraem。他们只是做他们的工作,他们的返回值将被忽略。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多