有一个点没过自己写的有点复杂,不先找了,总结一下错误 必须二刷
#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<cstring>
#include<cctype>
using namespace std;
map<string,set<int>> bkt,nfa,kew,npu;
//int book[10000]={},年份也不一定就一本书,book需要只存一个值时才能用
map<int,set<int>> nm;
int main(){
int n,que;
scanf("%d",&n);
for(int i=0;i<n;i++){
int tdi,nmm;
char bt[80],na[80],ke[60],np[80];
scanf("%d",&tdi);
getchar();
cin.getline(bt,80);
cin.getline(na,80);
bkt[bt].insert(tdi);
nfa[na].insert(tdi);
/*cin.getline(ke,60);
int ll=0,rr=0;
for(int q=0;q.ke.size())*/
//变个数输入
while(cin>>ke ){
kew[ke].insert(tdi);
char c=getchar();//终止判断(注意)
if(c=='\n') break;
}
cin.getline(np,80);
npu[np].insert(tdi);
scanf("%d",&nmm);
nm[nmm].insert(tdi);
}
scanf("%d",&que);
getchar();
string temp;
for(int i=0;i<que;i++){
string temp;//此处也要用getline
getline(cin,temp);
int io=stoi(temp.substr(0,1) ) ;//char变成string加个双引就可以了(注意)<-这种方式是错的
string oo=temp.substr(3);
int ioo;
if(io==5) ioo=stoi(oo);
printf("%s\n",temp.c_str());
if(io==1&&bkt.find(oo)!=bkt.end()){
for(auto it=bkt[oo].begin();it!=bkt[oo].end();it++){
printf("%07d\n",*it);
}
}
else if(io==2&&nfa.find(oo)!=nfa.end()){
for(auto it=nfa[oo].begin();it!=nfa[oo].end();it++){
printf("%07d\n",*it);
}
}
else if(io==3&&kew.find(oo)!=kew.end()){
for(auto it=kew[oo].begin();it!=kew[oo].end();it++){
printf("%07d\n",*it);
}
}
else if(io==4&&npu.find(oo)!=npu.end()){
for(auto it=npu[oo].begin();it!=npu[oo].end();it++){
printf("%07d\n",*it);
}
}
else if(io==5&&nm.find(ioo)!=nm.end()){
for(auto it=nm[ioo].begin();it!=nm[ioo].end();it++){
printf("%07d\n",*it);
}
}
else printf("Not Found\n");
}
return 0;
}
总结
1.每次用 getline 或者 cin.getline 在cin>>或者 scanf后面用 在scanf后面必须加getchar();
2.如果已经在scanf里面打出了一些要输入的字符,那么后面就不会输入了,直接输入里面没有的,比如上面你也可以先把‘\n’先打出来然后就不用getchar了
3.使用stoi 如果里面是char型,加双引也不对因为还有‘ ’,只能用substr,将其改为string型并且如果是重复临时变量,只能用cin输入
4.利用find函数,找是否存在某个值,map,也可以找第一个键存不存在,当不存在返回0冲突时只能这么干 !=。。。。.end()
英语
问题二刷 总结关于string getline的各种问题