• 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了,睡觉,睡觉,睡觉~_~ 

       

     

  • 相关阅读:
    解决ORA14098分区交换索引不匹配错误
    Oracle等待事件kfk:async disk IO
    Advanced Diagnostic using oradebug dumpvar
    shellscript 06 命令执行顺序
    Linux 备份策略
    shellscript 05 shell输入与输出
    Java video 02
    软件安装:原始码与 Tarball
    shellscript 07 正则表达式介绍
    shellscript 03 后台执行命令
  • 原文地址:https://www.cnblogs.com/TTTTT/p/3726787.html
Copyright © 2020-2023  润新知