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

7 回答 7

3

嗯,你cout << '\n';在那个循环里面有一个......所以它newline每次通过循环时都会打印一个。

于 2011-02-21T23:20:28.710 回答
3

当出现istream_iterator输入错误或文件结尾时(缓冲区溢出可能发生在您的向量不计算在内:))。

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


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

于 2011-02-21T23:27:21.437 回答
1

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

于 2011-02-21T23:21:59.490 回答
0

因为:

for(;;) 

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

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

还写:

cout << endl;

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

于 2011-02-21T23:23:04.697 回答
0

好吧,它并不能真正回答您的问题,但是您可以将两者合二为一copy,如

copy(istream_iterator<char>(cin), istream_iterator<char>(), ostream_iterator<char>(cout, " "));
于 2011-02-21T23:24:27.073 回答
0

我不认为这条线:

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

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

于 2011-02-21T23:28:36.040 回答
0

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

于 2011-02-22T01:00:19.760 回答