一、题目
原题目链接
二、解题
1.步骤
- 存储格式字符串:先用string存储整个格式字符串,再用map对各个选项以及选项的参数情况。
true:带参数选项,false不带参数选项
string line;
cin>>line;
map<char,bool> dct;//true:带参数选项,false不带参数选项
for(int i=0;i<line.size();i++){
if(line[i]!=':'){
dct.insert(pair<char,bool>(line[i],false));
}else{
dct[line[i-1]]=true;
}
}
- 核心
在输入流对象 ss 中,读取一个字符串数据并存储到变量 temp中,如果读取成功,则进行如下操作:
-
如果变量 temp 中存储的是带参选项,则读入下一个字符串到arg中。如果读取成功,则进行如下操作:
- 如果变量temp在 res 容器中已经存在,则更新该键值对的值为 arg。
- 如果变量 temp 在 res 容器中不存在,则添加一个新的键值对到 res 容器中,其中键为 temp,值为 arg。
-
如果变量中存储的是不带参选项,则添加一个新的键值对到 res 容器中,其中键为 temp,值为空。
-
如果无法继续读取字符串数据,则退出循环操作。
while(ss>>temp){
if(temp[0] == '-' && dct.find(temp[1])!=dct.end()){
if(dct[temp[1]]){//带参数
string arg;
if(ss>>arg){
if(res.find(temp)!=res.end()){//数据存在
res[temp]=arg;
}else{//数据不存在
res.insert(pair<string,string>(temp,arg));
}
}
else{
break;
}
}
else{//不带参数
res.insert(pair<string,string>(temp,""));
}
}
else{
break;
}
}
2.代码
dev c++ 5.11
// 201403-3 命令行选项
#include<bits/stdc++.h>
using namespace std;
int main(){
string line;
cin>>line;
map<char,bool> dct;//true:带参数选项,false不带参数选项
for(int i=0;i<line.size();i++){
if(line[i]!=':'){
dct.insert(pair<char,bool>(line[i],false));
}else{
dct[line[i-1]]=true;
}
}
int n;
cin>>n;
cin.ignore(); //删除输入流中的回车
string s;
map<string,string> res;
for(i=0;i<n;i++){
res.clear();//清空字符串中的所有字符
string temp;//指令
getline(cin,s);//读取一行字符串,遇到回车结束(过滤换行)
stringstream ss(s);
ss>>temp;
while(ss>>temp){
if(temp[0] == '-' && dct.find(temp[1])!=dct.end()){
if(dct[temp[1]]){//带参数
string arg;
if(ss>>arg){
if(res.find(temp)!=res.end()){//数据存在
res[temp]=arg;
}else{//数据不存在
res.insert(pair<string,string>(temp,arg));
}
}
else{
break;
}
}
else{//不带参数
res.insert(pair<string,string>(temp,""));
}
}
else{
break;
}
}
cout<<"Case "<<i+1<<": ";
map<string,string>::iterator iter;
for(iter=res.begin();iter!=res.end();iter++){
cout<<iter->first<<" ";
if(iter->second!=""){
cout<<iter->second<<" ";
}
}
cout<<endl;
}
return 0;
}
3.提交结果
总结
1.一些解释
stringstream ss(s);
ss>>temp;
在这段代码中,第一个从stringstream中提取的字符串会被存储在变量temp中,该单词会包含所有不包含空格的字符,不包括空格本身
。一次提取的单词是以空格为分隔符
的连续字符序列,因此,如果读取到的字符串是"Hello World",那么temp将存储"Hello"。如果要读取下一个单词,只需再次使用ss>>temp代码即可。这会将下一个单词读取到temp中,以此类推。
2.map中访问元素的一种方式:迭代器访问
map<string,string>::iterator iter;
for(iter=res.begin();iter!=res.end();iter++){
//iter是结构体指针访问,所以用->访问
cout<<iter->first<<" ";
if(iter->second!=""){
cout<<iter->second<<" ";
}
}