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

入力エラーまたはファイルのistream_iterator終わりが発生すると、は終了します(ベクターで発生する可能性のあるバッファオーバーランはカウントされません:))。

cinエラーまたはEOF状態になると、それ以降のすべての入力操作は失敗し(状態を除くcin.clear();)、コードは改行を表示するだけになります。


これがあなたが実際に望んでいるものであるかどうかは少し不明確です。おそらく、文字を読みたいだけですrows*column(おそらく、入力の改行を破棄します)。

于 2011-02-21T23:27:21.437 に答える
3

うーん、cout << '\n';そのループの中にあるのでnewline、ループを通過するたびに for を出力します。

于 2011-02-21T23:20:28.710 に答える
1

変数、行、列を初期化する必要があります (おそらく 0 に)。身につけるのは良い習慣です。

于 2011-02-21T23:21:59.490 に答える
0

理由:

for(;;) 

これは、「これを永遠に行う」の略であり、行と列の両方がcinでゼロに設定されることは決してないという事実と組み合わされています。

cin入力にゼロを入力してみてください。終了する場合があります。

また書く:

cout << endl;

バッファをフラッシュするのが好きなので、それが私がしていることです。

于 2011-02-21T23:23:04.697 に答える
0

まあ、それはあなたの質問に実際には答えませんが、あなたはあなたの2つcopyを1つに組み合わせることができます

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

行と列を何らかの値に初期化してから、それらまたは何かを減らすつもりでしたか? 現状では、コードが永遠に続く場合もあれば、ループの最初の実行時に興味深いことを行う前に終了する場合もあります。

于 2011-02-22T01:00:19.760 に答える
0

私はこの行を考えていません:

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

あなたがやりたいことをやっています...あなたがistream_iterator<char>()読みたい最後の要素を指すイテレータになるとは思わないので、このようにcinでコピーを使用できるかどうかはわかりません。これはどこかの例からですか?

于 2011-02-21T23:28:36.040 に答える