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 に答える
入力エラーまたはファイルのistream_iterator
終わりが発生すると、は終了します(ベクターで発生する可能性のあるバッファオーバーランはカウントされません:))。
cin
エラーまたはEOF状態になると、それ以降のすべての入力操作は失敗し(状態を除くcin.clear();
)、コードは改行を表示するだけになります。
これがあなたが実際に望んでいるものであるかどうかは少し不明確です。おそらく、文字を読みたいだけですrows*column
(おそらく、入力の改行を破棄します)。
うーん、cout << '\n';
そのループの中にあるのでnewline
、ループを通過するたびに for を出力します。
変数、行、列を初期化する必要があります (おそらく 0 に)。身につけるのは良い習慣です。
理由:
for(;;)
これは、「これを永遠に行う」の略であり、行と列の両方がcinでゼロに設定されることは決してないという事実と組み合わされています。
cin入力にゼロを入力してみてください。終了する場合があります。
また書く:
cout << endl;
バッファをフラッシュするのが好きなので、それが私がしていることです。
まあ、それはあなたの質問に実際には答えませんが、あなたはあなたの2つcopy
を1つに組み合わせることができます
copy(istream_iterator<char>(cin), istream_iterator<char>(), ostream_iterator<char>(cout, " "));
行と列を何らかの値に初期化してから、それらまたは何かを減らすつもりでしたか? 現状では、コードが永遠に続く場合もあれば、ループの最初の実行時に興味深いことを行う前に終了する場合もあります。
私はこの行を考えていません:
copy(istream_iterator<char>(cin), istream_iterator<char>(), dots.begin());
あなたがやりたいことをやっています...あなたがistream_iterator<char>()
読みたい最後の要素を指すイテレータになるとは思わないので、このようにcinでコピーを使用できるかどうかはわかりません。これはどこかの例からですか?