0

「停止」という単語が入力されるまで、入力を逆順に出力するプログラムを作成しようとしています。たとえば、私が入力した場合

dog cat monkey 
desk chair 
burger cheese ham 
stop 

出力する必要があります:

burger cheese ham
desk chair
dog cat monkey

これまでのところ、次のものがあります。

{
string x, y;
do {
    cin >> x;
    y = y + x;
} while (x != "stop");

int reverse = y.getNumLines();

while (reverse >= 0) {
    cout << y.getLine(reverse) << "\n";
    reverse = reverse -1;
}
return 0;    
} 

入力を正しく読み取りますが、y.getNumlinesy.getLineの場合、出力なしでエラーが発生します。誰でも私を助けることができますか?

4

2 に答える 2

3

追加する順序を交換してみませんか?

#include <iostream>

int main(int argc, const char * argv[])
{

    std::string x, y;
    while ( (std::getline(std::cin,x)) && x != "stop"){
        y = x + "\n" + y;  // "" + "foo bar"  2.) "second input" + "foo bar"
    }

    std::cout<< y;

    return 0;
}
于 2013-01-09T06:56:09.620 に答える
2

ニコの答えはあなたにとってより良い道かもしれませんが、より慣用的なアプローチを好む人には、一度保存すると簡単に逆方向に印刷できる行のベクトルをお勧めします. 最初のことはLine、スペースで停止する代わりに入力行を慣用的に読み取るために使用できるクラスです。

struct Line {
   std::string str;
};

std::istream &operator>>(std::istream &in, Line &line) {
   std::getline(in, line.str);

   if (line.str == "stop") {
       in.clear(std::ios::failbit);
   }

   return in;
}

std::ostream &operator<<(std::ostream &out, const Line &line) {
   out << line.str;
   return out;
}

必要なLineのは実際のテキストを含む文字列だけです。次に説明する理由から、入力と出力のサポートを追加しました。入力がgetlineではなくスルーであることに注意してください>>Lineこれがクラスの主な目的です。また、「stop」を入力すると失敗するようにしました。それが省略されている場合は、EOF まで読み取りを続けます。

これで、必要に応じて入力を整形するために、最小限の労力で line クラスを再利用できます。次に、作成したばかりのもの (または他のものから残したもの) を使用します。

int main() {
   std::istream_iterator<Line> in1(std::cin), in2;
   std::vector<Line> inputs(in1, in2);
   std::reverse_copy(std::begin(inputs), std::end(inputs), std::ostream_iterator<Line>(std::cout, "\n"));
}

最初に行うことは、入力を読み取ってベクトルを形成することです ( の入力サポートを使用Line)。ファイルの終わりに到達するか、「停止」が入力されると、停止し、すべての行入力がベクトルに適切に格納されます。

次に、reverse_copyベクトル内のすべて (入力の各行) を改行で区切って標準出力にコピーするように呼び出しますが、すべて逆方向に実行されるため、すべての行が逆の順序になります。

以上です!クラスが作成されると、Lineライン入力を取得してそれらを逆にするアルゴリズムは、単語で行っている場合と同じままでかまいませんが、ラインへの切り替えには、 のいくつかのインスタンスを に置き換えるだけで済みstd::stringますLine

于 2013-01-09T07:27:25.510 に答える