6

我正在学习 c++ 并让项目发送一个帕斯卡的三角形输出(经过 n 行计算)。得到这样的输出,存储在字符串流“缓冲区”中

 1
 1 1
 1 2 1
 1 3 3 1

但我想要的是

    1
   1 1
  1 2 1
 1 3 3 1

我的想法是:计算最后一行和当前行长度的差(我知道最后一行是最长的)。然后使用空格(行长差的一半)填充每一行。我现在的问题是:

  • 我不明白 getLine 是如何工作的,也不知道如何提取特定的(-> 最后一行)
  • 我不知道也找不到如何编辑字符串流中的特定行

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

所以这是一个相当普遍的问题:你是如何解决这个问题的,如果可能的话,使用 stringstreams - 怎么样?

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 回答