统计单词数
https://www.luogu.org/problemnew/show/P1308
大佬的题解粘来学习
AC代码:
1 #include <cstring> 2 #include <cctype> 3 #include <cstdio> 4 5 void strlower (char *a) {//手写函数,将大写字母转换成小写字母 6 for(int i = 0; a[i]; i ++ ) { 7 if(isupper(a[i])) a[i] = tolower(a[i]);//isupper是判断是否是大写字母的系统函数,tolower是将其转换成小写字母的函数 8 } 9 } 10 11 int main () { 12 13 char destination[1000001], *q, source[11], *p;//destintion是要找的文章,source是要找的单词,p和q都是指针类,分别代表当前搜索到什么地方了和最后一次找到单词的指针 14 bool flag = false;//判断是否找到了 15 int ans = 0, ans1 = -1;//个数和首次出现的位置,ans1的初值是-1是因为在没找到的时候就直接输出就行了,省事 16 17 gets(source); 18 gets(destination);//输入 19 20 strlower(destination);//全部转换成小写字母 21 strlower(source); 22 23 int len = strlen(source);//长度,在后面防止越界和加快速度 24 25 p = destination;//先将指针设为全部 26 27 for(; q = strstr(p, source); ) {//循环,strstr是在一个字符串里面给定一个字符串,寻找有没有这个字符串,若有,返回首次出现的指针否则返回NULL(空指针) 28 if( q != NULL//找到了 29 && ( q == destination || *(q - 1) == ' ') //第一个条件是防止越界,第二个是判断前一个是不是空格 30 && ( *(q + len) == '\0' || *(q + len) == ' ' ) ) {//如果后面也是空格 31 ans ++ ;//答案加一 32 if(flag == false) {//如果是首次找到 33 flag = true; 34 ans1 = q - destination;//第一个位置 35 } 36 } 37 p = q + len;//刷新指针 38 } 39 40 if(flag == true)//找到了 41 printf("%d %d" , ans, ans1);//输出 42 else 43 printf("%d", ans1);//输出-1 44 45 return 0; 46 }