zoukankan      html  css  js  c++  java
  • 统计单词数

    统计单词数

    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) == '' || *(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
  • 相关阅读:
    Linux 信号量之Posix有名字的信号量
    Linux 读写锁
    linux 互斥锁和条件变量
    linux 线程基础
    linux 进程通信之 守护进程
    linux 进程通信之 信号
    linux 进程通信之 mmap
    linux 进程通信之 管道和FIFO
    form表单标签(非常重要,必须掌握)
    微信支付问题汇总
  • 原文地址:https://www.cnblogs.com/wsy107316/p/11209256.html
Copyright © 2011-2022 走看看