统计单词数

统计单词数

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 }
View Code

 

posted @ 2019-07-18 18:42  swsyya  阅读(269)  评论(0编辑  收藏  举报

回到顶部