一、题目描述
二、思考
这题我感到困难的有以下几点:
- 如何判断输入命令是参数还是无参数:
答:由于命令是小写字母,我们可以使用两个bool数组进行判别。 - 如何处理输入的命令行:
答:使用string类型输入,使用stringstream进行字符串分割。 - 如何输出结果:
答:同理第一问,由于命令都是小写字母,那么我们使用一个string ans[]存储参数,下标对应着参数。 - 这题默认输入的有参数选项后面一定是有字符串作为参数的,比如我们输入:
注意看第二个-w后面跟的是-a,那么我们就把-a看成是-w的参数而不是作为命令(这是根据题目中参数的定义由减号、字母和数字构成)。那么最后的输出就应该是:albw:x 1 ls -w 10 -x -w -a -b
Case 1: -b -w -a -x
三、代码
#include <iostream>
#include <cstring>
#include <sstream>
#include <algorithm>
#include <vector>
using namespace std;
int n;
bool o1[26], o2[26];
int main() {
string str;
cin >> str >> n;
for ( int i = 0; i < str.size(); i++ ) {//输入字符串并进行处理
if ( str[i] != ':' ) {
if ( i != str.size() - 1 && str[i + 1] == ':' ) o2[str[i] - 'a'] = true;
else o1[str[i] - 'a'] = true;
}
}
getchar();
for ( int i = 1; i <= n; i++ ) {
getline(cin, str);
stringstream ssin(str);
string ans[26];
vector<string> ops;
while( ssin >> str ) ops.push_back(str);//对输入命令进行分割
for ( int j = 1; j < ops.size(); j++ ) {//从下标1开始便利,0是ls
if ( ops[j][0] != '-' || ops[j][1] < 'a' || ops[j].size() != 2 ) break;
int k = ops[j][1] - 'a';
if (o1[k]) ans[k] = "*";
else if (o2[k] && j + 1 < ops.size()) ans[k] = ops[j + 1], j++;
else break;
}
printf("Case %d:", i);
for ( int j = 0; j < 26; j++ ) {
if (ans[j].size()) {
cout << " -" << char( j + 'a' );
if ( o2[j] ) cout << " " << ans[j];
}
}
cout << endl;
}
return 0;
}
四、知识点
使用stringstrem分割字符串:
- 默认使用空格、tab和换行分割
stringstream ssin(str); vector<string> ops; while( ssin >> str ) ops.push_back(str);
- 使用其他字符进行分割:
stringstream ssin(str); vector<string> ops; while( getline(ssin, str, ',') ops.push_back(str);