#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; void consume(char ch) { while (getchar() != ch); } char key[32], title[128]; int main() { int T, N; scanf("%d", &T); while (T--) { scanf("%d", &N); consume('\n'); int res = 0; gets(key); for (int i = 0; i < N; i++) { gets(title); bool useful = false; char *token = strtok(title, " "); while (token != NULL) { if (strcmp(token, key) == 0) { useful = true; break; } token = strtok(NULL, " "); } if (useful) res++; } if (res == 0) printf("Do not find\n\n"); else printf("%d\n\n", res); } return 0; }论文的标题的字符串是由空格隔开,可拆成一个一个的单词,然后和查询的字符串比较即可。
除此之外,还有如:strcspn ,strstr ,strlen ,strncat,strncmp ,strncpy ,strpbrk 等
char *strtok(char *s, char *delim);
功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。实质上的处理是,strtok在s中查找包含在delim中的字符并用NULL(’\0′)来替换,直到找遍整个字符串。
说明:首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。strtok在s中查找包含在delim中的字符并用NULL('\0')来替换,直到找遍整个字符串。
返回值:从s开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。
#include<cstdio> #include<cstring> int T,n,ans; char key[21],title[102]; int main() { //freopen("1.txt","r",stdin); scanf("%d",&T); while(T--) { scanf("%d",&n); getchar(); gets(key); ans = 0; while(n--) { bool flag = false; gets(title); char *tok = strtok(title," "); while(tok !=NULL) { if(strcmp(key,tok)==0) { flag = true; break; } tok = strtok(NULL," "); } if(flag) ans++; } if(ans == 0) printf("Do not find\n\n"); else printf("%d\n\n",ans); } return 0; }
/* strtok example */ #include <stdio.h> #include <string.h> int main () { char s[100]; printf("请输入一行字符串:"); gets(s); printf("下面显示的将是通过空格和分号和惊叹号分割产生的字符串\n"); char *pch = strtok(s," ;!"); while (pch != NULL) { printf ("%s\n",pch); pch = strtok (NULL, " ;!"); } return 0; }
关于字符串的处理如果用指针而不是用编译器提供的系统函数将会是比较复杂的一件事情
下面尝试着实现一下
表示写了一个多小时失败了,还是指针学的不好