题目
思路
题目略显复杂,但是读完之后觉得题目的意思就是对于命令行的选项进行提取,有参数的提取最后一个输入的参数,遇到非法的选项时,就停止对该命令的分析。
本题目考虑的是对字符串的处理能力。具体的操作都写在代码的注释中了。
代码
#include <iostream>
#include <cstring>
#include <sstream>
#include <vector>
using namespace std;
/*
思路:
该题目主要考察对字符串的操作
*/
const int N = 30;
//用于存储不带参数的选项
bool o1[N];
//用于存储带参数的选项
bool o2[N];
//存储每个选项的参数,即便不带参数也会填充一个'*'
string ans[N];
int main() {
string str;
//cin输入时,不会自动舍弃换行符,为了避免对后续输入的影响,添加一个getchar()
cin >> str;
getchar();
//对第一行的处理
for (int i = 0; i < str.size(); i++) {
//带参数的情况
if (i + 1 < str.size() && str[i + 1] == ':') {
o2[str[i] - 'a'] = true;
i++;
} else {
o1[str[i] - 'a'] = true;
}
}
int n;
cin >> n;
getchar();
for (int c = 0; c < n; c++) {
getline(cin, str);
cout << "Case " << c + 1 << ":";
//读入一行字符串
//利用ssin将字符串按照空格进行分割
stringstream ssin(str);
vector<string>ops;
//将分割好的子串存储到数组中
while (ssin >> str)
ops.push_back(str);
for (int i = 0; i < 26; i++)
ans[i].clear();//数组初始化
for (int j = 1; j < ops.size(); j++) { //从1开始将命令跳过
//判断子串是否是合法的选项,此处对于参数也认为是不合法的选项
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;
}
}
for (int i = 0; i < 26; i++) {
if (ans[i].size()) {
cout << " -" << (char)(i + 'a');
if (o2[i]) {
cout << ' ' << ans[i];
}
}
}
cout << endl;
}
return 0;
}