2012-05-04 6 views
6

私はC++を学んでおり、プロジェクトにパスカルの三角形を出力して(n行の計算後に)、このような出力を得て、ストリングストリームの "バッファ"に格納しますstringstreamをインデント/センタ出力に使用する

1 
1 1 
1 2 1 
1 3 3 1 

しかし、私がしたいことは、むしろ

1 
    1 1 
    1 2 1 
1 3 3 1 

私の考えでは:最後の行と現在の行の長さ(私は最後のものが最長であることを知っている)の違いを計算します。その後、各行をスペースで区切ります(行長差の半分)。 私の問題は今ある:

  • は、私がどのようにgetlineの作品を取得しませんでした、どちらも私は特定の抽出する方法を - 私は知りません(>最後の)行
  • をし、1を編集する方法を見つけることができませんでしたストリングストリーム内の特定の行

どういうわけか私はストリングストリームを使用する最良の方法ではないと感じています。

これはむしろよくある質問です。この問題をどのように解決し、可能であればストリングストリームで解決しましたか?

+1

http://www.cplusplus.com/reference/iostream/manipulators/setw/これを見てください – v01d

+0

ちょうど明確にするために、あなたは自分自身と印刷の価値を計算していますか?または、それらを解析して再印刷していますか? – Benj

+0

私は自分自身を計算し、私はsetwを見てみるつもりです、良い方法だと思われます:-) – AnatraIlDuck

答えて

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()) 

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 
} 
+1

Nが増え、2桁の数字が出てくるとうまくいかないのでしょうか?それは? – nims

+1

@nims確かに、桁数を得るにはwidth = max(choose(N、k)%10)を計算し、(N - 1 - i)*幅の空白を書く必要があります。私の主張は、単に計算後に出力をフォーマットするのではなく、フォーマットと計算を組み合わせるほうが簡単だということでした。 – TemplateRex

+0

どういうわけか、最初に値を計算してから出力をフォーマットする方がいいと思います... – AnatraIlDuck

関連する問題