CCF命令行选项---初识sstream和getline()

tech2023-02-16  106

CCF-201403-3

通过这个题目我认识一下sstream和getline()让我们看看题目怎么说解题思路代码是这样的STL-set的API

通过这个题目我认识一下sstream和getline()

让我们看看题目怎么说

解题思路

1.首先我们要把第一行的字母提取出来,分辨出每个字母是带参的还是不带参的,可以使用两个vector,两个set,我们这里使用的是一个map,set在这里原则上会好于vector,因为set有find函数,这样查找的时候会方便,不多说,此题我们使用了map来存贮字母,1表示带参,0表示不带参 2.每一行的输入要使用到getline,然后把getline里面的string提取出来,我们使用到了sstream中的stringstream。 需要注意的是:在getline()前要先读入一个空格,我们使用getchar()或者cin.ignore()都可以,这里我们使用了后者 3.由于输入的字母需要排序,所以我们用set来存贮输出的结果 在每次输入前,查询的map-m,和存储的set-ans和输入输出流ss都需要clear() 4.失分点:如果带参的字母后面参数为空,那么这个参数报错,需要break; 5.失分点:ss.str(str) 不能用ss<<str代替,不然只能拿10分。

代码是这样的

#include<iostream> #include<cstring> #include<sstream> #include<map> #include<set> using namespace std; int main(){ stringstream ss; map<char,int> symbol; map<string,string> m; set<string> ans; string str; cin>>str; for(int i=0;i<str.length();i++){ if(str[i+1]==':'){ symbol[str[i]]=1; i++; }else{ symbol[str[i]]=0; } } int n; cin>>n; cin.ignore(); for(int i=1;i<=n;i++){ string temp; getline(cin,str); m.clear(); ans.clear(); ss.clear(); ss.str(str); ss>>temp; while(ss>>temp){ if(temp[0]=='-'){ if(symbol.find(temp[1])!=symbol.end()){ if(symbol[temp[1]]==1){ string temp2; ss>>temp2; if(temp2.empty()) break; m[temp]=temp2; } ans.insert(temp); } else break; } else break; } cout<<"Case "<<i<<": "; for(set<string>::iterator it=ans.begin();it!=ans.end();it++){ cout<<*it<<" "; if(m.find(*it)!=m.end()){ cout<<m[*it]<<" "; } } cout<<endl; } return 0; }

STL-set的API

最新回复(0)