【问题标题】:Why does this code continuously print newlines?为什么这段代码不断打印换行符?
【发布时间】:2011-07-01 15:21:44
【问题描述】:
 int row,column;

 for (;;) {

    cin >> rows >> columns;

    if (!rows && !columns) break;

    vector<char> dots(rows * columns);

    copy(istream_iterator<char>(cin), istream_iterator<char>(), dots.begin());

    // process vector

    copy(dots.begin(), dots.end(), ostream_iterator<char>(cout, " "));

    cout << '\n';
}

【问题讨论】:

  • 变量是row,还是rows? C++ 不会自动修复复数。

标签: c++ loops io iostream istream-iterator


【解决方案1】:

当出现输入错误或文件结尾时,istream_iterator 到达其末尾(向量可能发生的缓冲区溢出不算:))。

一旦cin 处于错误或EOF 状态,所有后续输入操作都将失败(除非您cin.clear(); 处于该状态)并且代码最终只显示换行符。


有点不清楚这是否是您真正想要的。也许您只是想阅读rows*column 字符(可能会丢弃输入中的换行符)。

【讨论】:

  • 我认为你是对的,只需要添加一个cin.clear()。我猜想关于换行符的混淆只是因为缺乏反馈而发生。简单地输出行和列的值会表明它每次都重用相同的第一个值,但是由于点被重置,它不会输出任何东西。
  • 添加 cin.clear() 修复它,谢谢。我还通过将 back_inserter 作为第三个参数传递给 std::copy 来修复潜在的缓冲区溢出
【解决方案2】:

嗯,您在该循环中有一个 cout &lt;&lt; '\n';...所以它会在每次循环时打印一个 newline

【讨论】:

  • 是的,但是它在打印一次向量的内容后只打印换行符......我想要做的是每次循环读取新数据并打印它
  • @RaouL:您能否发布示例输入和输出数据(包括预期数据和输出数据)。
  • 我不同意,for(;;)定义 为无限,但while(1) 可以说只是对条件循环的滥用(并且可能会发出警告,这可能很烦人)。
【解决方案3】:

您需要初始化变量、行和列(可能为 0)。这是一个好习惯。

【讨论】:

  • 检查输入是否成功更为重要。除非你真的需要像 int 这样的初始值,否则添加一个虚拟值只会隐藏你可能在某些时候未初始化使用它(这可能是来自编译器的警告)。
  • 没错,在这种情况下,cin 在第二次迭代后失败(因为缺少 cin.clear()),因此代码重用了相同的行和列的旧值。每次在尝试读取输入之前将它们重置为 0 即可防止此类错误。
【解决方案4】:

因为:

for(;;) 

这代表“永远这样做”,再加上行和列可能永远不会都用 cin 设置为零这一事实。

尝试在 cin 输入中输入零,它可能会结束。

也写:

cout << endl;

这正是我所做的,因为我喜欢刷新缓冲区。

【讨论】:

    【解决方案5】:

    嗯,它并没有真正回答你的问题,但你可以将你的两个 copy 合二为一,就像

    copy(istream_iterator<char>(cin), istream_iterator<char>(), ostream_iterator<char>(cout, " "));
    

    【讨论】:

      【解决方案6】:

      我不认为这条线:

      copy(istream_iterator<char>(cin), istream_iterator<char>(), dots.begin());
      

      正在做你想做的事......我不确定你是否可以通过这种方式将 copy 与 cin 一起使用,因为我认为 istream_iterator&lt;char&gt;() 不会是指向你想要的最后一个元素的迭代器阅读。这是来自某个地方的示例吗?

      【讨论】:

        【解决方案7】:

        您是否打算将行和列初始化为某个值,然后递减它们或其他什么?就目前而言,有时你的代码会永远继续下去,有时它会在循环的第一次运行时退出,甚至还没有做任何有趣的事情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 2022-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多