文章目录
题目解答
来源:acwing
分析:
输出要求:对于无参数的选项,输出即可,当然每个只需要输出一次;对于有参数的选项,需要输出最后出现时所带的参数。
当遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。
比如下面例子, -a是无参数的选项,所以 第二次出现时后面带有参数就是不合法的,我们直接忽略,结果就是 -a -l
,后面的-b被忽略。
ls -a -l -a documents -b
这里使用getline()
读入一行,然后这一行怎么拆分呢?使用的是stringstream
类,实例化对象ssin,它从字符串中读取字符,以空格切分。然后将拆分出来的每个单词放到vector中。 具体如下:ssin是变量名,可以随便取。
stringstream ssin(str);//从字符串开始读,以空格隔开
vector<string> ops;
while(ssin>>str) ops.push_back(str);
同时:对于无参数的选项和有参数的选项我们开两个bool数组来存,o1[]
存 无参数的,o2[]
存有参数的,出现过置为true,这样就可以知道每个选项带参数与否。
最终的结果存在ans[]
数组中,这个数组的目的是确保哪个选项是要被输出的,如果是无参的,随便填个数占位;如果是有参的,这里存的是参数。
ac代码
#include<bits/stdc++.h>
using namespace std;
const int N = 30;
int n;
bool o1[N], o2[N];// o1是无参数, o2是有参数
string ans[N]; //存答案
int main(){
string str;
cin >> str;
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; // 无参数的
cin >> n;
getchar();
for(int C = 1;C <= n; C++){
printf("Case %d:", C);
getline(cin, str);
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 i =1; i< ops.size(); i++){
if(ops[i][0] != '-' || ops[i][1] < 'a' || ops[i].size() != 2)
break;
int k = ops[i][1] - 'a'; //选项的编号
if(o1[k]) ans[k] = "*";
// 有参数的,ans[k]存的是参数值
else if( o2[k] && i + 1 < ops.size() ) ans[k] = ops[i+1], i ++;
else break;
}
// 按照字典序输出选项 a ~ z
for(int i = 0; i< 26; i++){
if( ans[i].size()){
cout << " -" << (char)(i + 'a');
if(o2[i]) cout << ' ' << ans[i];
}
}
cout << endl;
}
}
题目链接
https://www.acwing.com/problem/content/3202/