这个题目看起来很熟悉,没错,就是紫书上第5章的例题5-8 “Unix ls 命令”,这里的处理方式可以说和例题几乎一模一样。就简单讲一下我的思路吧。
首先是是用一个vector<string> s[maxn]
来存储所有的数据,这就相当于一个二维string数组,我们将其存入之后,首先得找出每一列中字符串最长是多少,并且以其作为这一列的标准,这一列的所有其它元素必须通过在末尾添空格以达到和其一样长度。这个每列中最长的字符串的长度可以保存在一个数组中,输出同一行不同列时就可以找到自己的标准长度。不足就在后面添空格。
下面是代码:
#include<iostream>
#include<string>
#include<sstream>
#include<vector>
using namespace std;
const int maxn = 1000+5;
const int maxb = 180+5;
vector<string> s[maxn];
int n, m, a[maxb];
int main() {
string buf;
n = 0; m = 0;
while(getline(cin, buf)) {
string str;
stringstream ss(buf);
while(ss >> str) s[n].push_back(str);
m = m > s[n].size() ? m : s[n].size() ;
n++;
}
for(int j = 0; j < m; ++j) {
a[j] = 0;
for(int i = 0; i < n; ++i) {
if(s[i].size() < j+1) continue;
a[j] = a[j] > s[i][j].length() ? a[j] : s[i][j].length() ;
}
}
for(int i = 0; i < n; ++i) {
for(int j = 0; j < s[i].size(); ++j) {
if(j != 0) cout << " ";
int x = a[j] - s[i][j].length();
cout << s[i][j];
//注意这个细节:每一行的最后一个元素没有达到标准长度时,不用在后面添加空格
if(j == s[i].size()-1) continue;
else while(x--) cout << " ";
}
cout << "\n";
}
return 0;
}
注意代码中的那段注释!!