UVa 1593 Alignment of Code 细节

这个题目看起来很熟悉,没错,就是紫书上第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;
}

注意代码中的那段注释!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值