2012-05-04 21 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作品,无论我怎么可能会提取特定( - >末页)线路
  • 我不知道,但没有找到如何编辑一个字符串流中的特定行

不知何故,我觉得我没有使用stringstream的最佳方式。

所以这是一个相当常见的问题:你如何解决这个问题,如果可能的话用串流 - 如何?

+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是当前行。因此,每个后续行在左侧的空间都减少了一个。

接下来,我需要添加行的原始大小(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增加和两位数字进场时起作用。会吗? – nims

+1

@nims当然,你需要计算'width = max(选择(N,k)%10'来得到数字的位数,并且写(N - 1 - i)*宽的空格。我的观点只是将格式与计算结合起来更容易,而不是在计算后格式化输出。 – TemplateRex

+0

不知何故,我会觉得更好,首先计算值,然后格式化输出... – AnatraIlDuck