zoukankan      html  css  js  c++  java
  • C语言每日一题之No.8

          正式面对自己第二天,突然一种强烈的要放弃的冲动,在害怕什么?害怕很难赶上步伐?害怕这样坚持到底是对还是错?估计是今天那个来了,所以身体激素有变化导致情绪起伏比较大比较神经质吧(☆_☆)~矮油,女人每个月总有这么几天的。。。。晚上闺蜜打电话来,共同探讨了作为单身女性身在一线城市的生活,互相安慰互相关心,心里一下子就温暖了许多。总在这个时候,你会觉得,这个冷静的城市里你不是一个人在行走,还有另一颗心牵挂着你。嘿嘿,回来该学习还学习。现在不管坚持是对的还是错的,你都踏上了研发这条不归路,那就一条黑走到底吧。女王陛下,请接题:

    一.题目:编写程序,实现下面一个有关单词个数统计问题。编写一个函数findstr(char *str,char 

                *substr),该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。例如,假

             定输入的字符串为”asd asasdfg asd as zx67 asd mklo”,子字符串为as,函数返回

             值是6

                asd asasdfg asd as zx67 asd mklo

                as

                6

    二.思路:将字符串指针依次往后移动与子字符串比较

                每轮比较的长度为为子字符串的长度

                每轮比较中若字符串和子字符串连续相等,则count加1

    三.程序

     1 #include <stdio.h>
     2 #define SIZE 80
     3 #define NUMBER 2
     4 int main(void)
     5 {
     6     char FatherStr[SIZE]={0};
     7     char SubStr[SIZE]={0};
     8     int findstr(char *str,char *substr);
     9     int cnt = 0;
    10 
    11     printf("Please input the father string:
    ");
    12     gets(FatherStr);
    13     printf("Please input the sub string:
    ");
    14     gets(SubStr);
    15     cnt = findstr(FatherStr,SubStr);
    16     printf("the count is:%d
    ",cnt);
    17     
    18     return 0;
    19 }
    20 
    21 
    22 int findstr(char *str,char *substr)
    23 {
    24    int index = 0;//index记录子字符串的索引
    25    int count = 0;//count记录相等个数
    26 
    27    for(int i=0;*(str+NUMBER);i++)
    28    {   //每轮比较从i开始依次移动子字符串的长度
    29        for(int j=i;*substr;j++)
    30        {  //一旦有不相等的,立刻退出
    31           if(str[j] != substr[index++])
    32               break;
    33        }
    34        //如果index=NUMBER,代表一轮比较顺利完成
    35        if(NUMBER == index)
    36        {
    37          count++;
    38          i = i+NUMBER-1;//父字符串的下一轮开头可以跳过NUMBER个长度了
    39        }
    40        //每次将子字符串的索引重新归零
    41        index =0;
    42    }
    43 
    44    return count++;
    45 
    46 }

    四.编译运行

       显示出错,关闭程序

    五.分析 

       1. 经过调试,发现在index那里应该是NUMBER+1,因为当退出第二层循环时,已经说明这时的字符不相等了,所  

          以index此时应该是NUMBER+1才对。

       2.外层循环是利用*(str+NUMBER)来作为父字符串结束的条件,内循环是利用*substr来作为结束条件。调试时发

         现已经将父字符串比较完了,可是外层循环还在继续,也就是说,后面一直用父字符串的SIZE剩下的空字符在与

         子字符串比较。这就怪了,难道*(str+NUMBER)用来判断字符结束吗?如果换成*str[i+NUMBER]就可以了。

         解答:因为这里不同于以往你用指针时是直接利用指针,然后进行指针操作比如str++,在这种情况下,str是

         实时的指向当前数据,所以这种情况下判断字符串结束的标志是*str。

         而现在这里是利用数组的方法str[i++],所以str是静止的它始终指向的是数组的第一个元素,真正实时指向当前数

         据的是str[i]即*(str+i),所以正确的做法应该是*(str+i+NUMBER)

    六.改进

     1 #include <stdio.h>
     2 #define SIZE 80
     3 #define NUMBER 2
     4 int main(void)
     5 {
     6     char FatherStr[SIZE]={0};
     7     char SubStr[SIZE]={0};
     8     int findstr(char *str,char *substr);
     9     int cnt = 0;
    10 
    11     printf("Please input the father string:
    ");
    12     gets(FatherStr);
    13     printf("Please input the sub string:
    ");
    14     gets(SubStr);
    15     cnt = findstr(FatherStr,SubStr);
    16     printf("the count is:%d
    ",cnt);
    17     
    18     return 0;
    19 }
    20 
    21 
    22 int findstr(char *str,char *substr)
    23 {
    24    int index = 0;//index记录子字符串的索引
    25    int count = 0;//count记录相等个数
    26    //从倒数NUMBER个字符串开始就不能再继续进行外层循环了,以为内层循环里将对字符串往后依次挪NUMBER个
    27    for(int i=0;str[i+NUMBER]!='';i++)
    28    {   //每轮比较从i开始依次移动子字符串的长度
    29        for(int j=i;*substr;j++)
    30        {  //一旦有不相等的,立刻退出
    31           if(str[j] != substr[index++])
    32               break;
    33        }
    34        //如果index=NUMBER,代表一轮比较顺利完成
    35          if(NUMBER+1 == index)
    36        {
    37          count++;//count加1来记录相等个数
    38          i = i+NUMBER-1;//父字符串的下一轮开头可以跳过NUMBER个长度了
    39        }
    40        //每次将子字符串的索引重新归零
    41        index =0;
    42    }
    43 
    44    return count++;
    45 
    46 }

    七.运行结果

     

    八.网上解答版本

     1   #include"stdio.h"
     2   #include"string.h"
     3   int main(void)
     4   {
     5       char s1[80],s2[80];
     6       int n;
     7       int findstr(char *str,char *substr);
     8       printf("请输入一个字符串:"); 
     9       gets(s1);
    10       printf("请输入你要查找的字符串:"); 
    11       gets(s2);
    12       n=findstr(s1,s2);
    13       printf("%s在%s里共有%d个
    ",s2,s1,n);
    14       return 0;
    15   }
    16   int findstr(char *str,char *substr)
    17   {
    18       int i,j,k,count=0;
    19       char temp[80];
    20       int length=strlen(substr);
    21       for(i=0;i<strlen(str);i++)
    22       {
    23           k=0;
    24           for(j=i;j<i+length;j++)
    25               temp[k++]=str[j];
    26           temp[k]='';
    27           if(!strcmp(temp,substr)) count++;
    28       }
    29       return count;
    30   }

    九.比较

       他的方法比我的好的地方有两点

      1.在循环的条件控制上,他要清晰的多:外层循环i从0到strlen(str)(当然,这里它忽略了str+length),内层循环j

       从i到i+length。lenght可直接从子字符串获取,无需固定成多长的字符串。

      2.他用来strcmp这个函数,我需要学习这个函数啦

    十.知识点

    strcmp函数

    今天题目很轻松,真是天助我也,12:30了,睡觉,睡觉,睡觉~_~ 

       

     

  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/TTTTT/p/3726787.html
Copyright © 2011-2022 走看看