我正在学习c ++并且让项目发送一个pascal三角形来输出(在n行计算之后)。得到这样的输出,存储在字符串流“buffer”中
1
1 1
1 2 1
1 3 3 1
但我想要的却是
1
1 1
1 2 1
1 3 3 1
我的想法是:计算最后一行和当前行长度的差异(我知道最后一行是最长的)。然后使用空格填充每一行(行长度差的一半)。 我现在的问题是:
不知何故,我觉得我没有使用stringstream的最佳方式。
所以这是一个很常见的问题:你如何解决这个问题,如果可能的话,用串流来解决这个问题?
答案 0 :(得分: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())
希望这有帮助!
答案 1 :(得分: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
}