首先是数据结构,gets的行输入以及scanf会接收末尾空格
strstr(str,substr)寻找str中是否有substr,没有返回null
最后sort一下,控制格式为%07d即可
#include<iostream>
#include<cstdio>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=10005;
int cnt=0,n,m,ans[N];
struct book{
int id;
char title[100],author[100],keywords[60],publisher[100],year[5];
}b[N];
void input(int i){
scanf("%d",&b[i].id);
getchar();
gets(b[i].title);
gets(b[i].author);
gets(b[i].keywords);
gets(b[i].publisher);
gets(b[i].year);
}
void title(char* a){
for(int i=0;i<n;i++)
if(strcmp(a,b[i].title)==0)
ans[cnt++]=b[i].id;
}
void author(char* a){
for(int i=0;i<n;i++)
if(strcmp(a,b[i].author)==0)
ans[cnt++]=b[i].id;
}
void keyword(char *a){
for(int i=0;i<n;i++)
if(strstr(b[i].keywords,a))
ans[cnt++]=b[i].id;
}
void publisher(char *a){
for(int i=0;i<n;i++)
if(strcmp(a,b[i].publisher)==0)
ans[cnt++]=b[i].id;
}
void year(char *a){
for(int i=0;i<n;i++)
if(strcmp(a,b[i].year)==0)
ans[cnt++]=b[i].id;
}
void query(){
int kk;
cnt=0;
char a[100];
scanf("%d: ",&kk);
gets(a);
switch(kk){
case 1:title(a);break;
case 2:author(a);break;
case 3:keyword(a);break;
case 4:publisher(a);break;
case 5:year(a);break;
}
printf("%d: %s\n",kk,a);
if(cnt==0){
printf("Not Found\n");
return;
}
sort(ans,ans+cnt);
for(int i=0;i<cnt;i++)
printf("%07d\n",ans[i]);
}
int main(){
cin>>n;
getchar();
for(int i=0;i<n;i++)
input(i);
cin>>m;
while(m--)
query();
return 0;
}