为什么此代码会不断打印换行符?

时间:2011-02-21 23:18:57

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

 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';
}

7 个答案:

答案 0 :(得分:3)

嗯,你在那个循环中有一个cout << '\n'; ...因此每次循环都会打印newline

答案 1 :(得分:3)

当输入错误或文件结束发生时,istream_iterator到达终点(缓冲区溢出可能会导致向量不计数:))。

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


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

答案 2 :(得分:1)

您需要初始化变量,行和列(可能为0)。进入是一个很好的习惯。

答案 3 :(得分:0)

因为:

for(;;) 

哪个代表'永远这样做'结合了行和列可能永远不会被cin设置为零的事实。

尝试为cin输入键入零,它可能会结束。

还写:

cout << endl;

这就是我的工作,因为我喜欢冲洗缓冲区。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

我不认为这一行:

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

正在做你想做的事情...我不确定你是否可以用这种方式使用cin副本,因为我不认为istream_iterator<char>()将是一个指向最后一个元素的迭代器你想读。这是一个例子吗?

答案 6 :(得分:0)

您是否打算将行和列初始化为某个值,然后减少它们或其他什么?就目前而言,有时候你的代码会永远存在,有时它会在循环的第一次运行之前退出,直到它做任何有趣的事情。