6

私はc++を学んでいて、パスカルの三角形を出力に送信するプロジェクトを取得しました(n行の計算後)。このような出力を取得し、文字列ストリームの「バッファー」に格納します。

 1
 1 1
 1 2 1
 1 3 3 1

しかし、私が欲しいのはむしろ

    1
   1 1
  1 2 1
 1 3 3 1

私の考えは、最後の行と現在の行の長さの差を計算することでした(最後の行が最も長いことはわかっています)。次に、スペース(行の長さの差の半分)を使用して各行をパディングします。今の私の問題は:

  • getLineがどのように機能するか、特定の(->最後の)行を抽出する方法もわかりませんでした
  • 文字列ストリームの特定の1行を編集する方法がわからず、見つかりませんでした

どういうわけか、私はstringstreamを使用するのが最善の方法ではないと感じました。

したがって、これはかなり一般的な質問です。この問題をどのように解決し、可能であれば文字列ストリームを使用して解決しますか?

4

2 に答える 2

2

最初の行のインデントを知るには、入力の行数を知る必要があります。したがって、最初にすべての入力を読み込む必要があります。すべての入力を読み込んだ後の合計行数を示す.size()メンバー関数の便宜のために、ベクトルを使用して値を格納することを選択しました。

#include<iostream>
#include<sstream>
#include<vector>
#include<iomanip> // For setw
using namespace std;
int main()
{
  stringstream ss;
  vector<string> lines;
  string s;

  //Read all of the lines into a vector
  while(getline(cin,s)) 
    lines.push_back(s);

  // setw() - sets the width of the line being output 
  // right  - specifies that the output should be right justified 
  for(int i=0,sz=lines.size();i<sz;++i)
    ss << setw((sz - i) + lines[i].length()) << right << lines[i] << endl;

  cout << ss.str();
  return 0;
}

この例では、setwを使用して、線の幅を右揃えに設定しています。文字列の左側のパディングは(sz --i)で与えられます。ここで、szは行の総数、iは現在の行です。したがって、後続のすべての行の左側のスペースは1つ少なくなります。

次に、行の元のサイズ(lines [i] .length())を追加する必要があります。そうしないと、結果の文字列の左側に正しいパディングを配置するのに十分なスペースが行に含まれません。

setw((sz - i) + lines[i].length())

お役に立てれば!

于 2012-05-08T20:32:06.303 に答える
0

初期出力を書き込むコードにアクセスでき、書き込んでいる行数がわかっている場合は、次のNようにするだけです。

for(int i = 0; i < N; ++i) {
    for(int j = 0; j < N - 1 - i; ++j)
        sstr << " "; // write N - 1 - i spaces, no spaces for i == N.
    // now write your numbers the way you currently do
}
于 2012-05-04T08:35:25.777 に答える