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

一.题目:编写程序,实现下面一个有关单词个数统计问题。编写一个函数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

三.程序

 #include <stdio.h>
#define SIZE 80
#define NUMBER 2
int main(void)
{
char FatherStr[SIZE]={};
char SubStr[SIZE]={};
int findstr(char *str,char *substr);
int cnt = ; printf("Please input the father string:\n");
gets(FatherStr);
printf("Please input the sub string:\n");
gets(SubStr);
cnt = findstr(FatherStr,SubStr);
printf("the count is:%d\n",cnt); return ;
} int findstr(char *str,char *substr)
{
int index = ;//index记录子字符串的索引
int count = ;//count记录相等个数 for(int i=;*(str+NUMBER);i++)
{ //每轮比较从i开始依次移动子字符串的长度
for(int j=i;*substr;j++)
{ //一旦有不相等的,立刻退出
if(str[j] != substr[index++])
break;
}
//如果index=NUMBER,代表一轮比较顺利完成
if(NUMBER == index)
{
count++;
i = i+NUMBER-;//父字符串的下一轮开头可以跳过NUMBER个长度了
}
//每次将子字符串的索引重新归零
index =;
} return count++; }

四.编译运行

显示出错,关闭程序

五.分析

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)

六.改进

 #include <stdio.h>
#define SIZE 80
#define NUMBER 2
int main(void)
{
char FatherStr[SIZE]={};
char SubStr[SIZE]={};
int findstr(char *str,char *substr);
int cnt = ; printf("Please input the father string:\n");
gets(FatherStr);
printf("Please input the sub string:\n");
gets(SubStr);
cnt = findstr(FatherStr,SubStr);
printf("the count is:%d\n",cnt); return ;
} int findstr(char *str,char *substr)
{
int index = ;//index记录子字符串的索引
int count = ;//count记录相等个数
//从倒数NUMBER个字符串开始就不能再继续进行外层循环了,以为内层循环里将对字符串往后依次挪NUMBER个
for(int i=;str[i+NUMBER]!='\0';i++)
{ //每轮比较从i开始依次移动子字符串的长度
for(int j=i;*substr;j++)
{ //一旦有不相等的,立刻退出
if(str[j] != substr[index++])
break;
}
//如果index=NUMBER,代表一轮比较顺利完成
if(NUMBER+ == index)
{
count++;//count加1来记录相等个数
i = i+NUMBER-;//父字符串的下一轮开头可以跳过NUMBER个长度了
}
//每次将子字符串的索引重新归零
index =;
} return count++; }

七.运行结果

八.网上解答版本

   #include"stdio.h"
  #include"string.h"
  int main(void)
  {
   char s1[],s2[];
   int n;
   int findstr(char *str,char *substr);
   printf("请输入一个字符串:");
   gets(s1);
   printf("请输入你要查找的字符串:");
   gets(s2);
   n=findstr(s1,s2);
   printf("%s在%s里共有%d个\n",s2,s1,n);
   return ;
  }
  int findstr(char *str,char *substr)
  {
   int i,j,k,count=;
   char temp[];
   int length=strlen(substr);
   for(i=;i<strlen(str);i++)
   {
   k=;
   for(j=i;j<i+length;j++)
   temp[k++]=str[j];
   temp[k]='\0';
   if(!strcmp(temp,substr)) count++;
   }
   return count;
  }

九.比较

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

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

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

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

十.知识点

strcmp函数

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

C语言每日一题之No.8的更多相关文章

  1. C语言每日一题之No.1

    鉴于在学校弱弱的接触过C,基本上很少编程,C语言基础太薄弱.刚好目前从事的是软件编程,难度可想而知.严重影响工作效率,已无法再拖下去了.为此,痛下决心恶补C语言.此前只停留在看书,光看好像也记不住,C ...

  2. C语言每日一题之No.9

    再做决定之前,我还是做好自己该做的.我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦.尊敬的女王陛下,请接题: 一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规 ...

  3. C语言每日一题之No.4

    这几天老大也没安排我什么项目,于是想正好趁着空补C.当然,是利用晚上加班时间,白天正常上班时间还是学习公司的平台. 今儿个突然弱弱的感觉到在公司补C是件很低级的事情,哪怕是在加班时间都会被喷,因为大家 ...

  4. C语言每日一题之No.3

    几天下来,感慨学习要坚持下来真的是件很难的事,本来说了每天一题,可是毕竟这是个细活,需要用心雕琢,有时候真的不能当天拿下来>_<.虽然说只是一题,却涉及到很多小细节,慢慢的琢磨直至完全摸透 ...

  5. C语言每日一题之No.12

    文件操作知识:如何将一个文件的内容读取到另一个文件里? fread函数和fwrite函数   1.函数功能   用来读写一个数据块. 2.一般调用形式   fread(buffer,count,siz ...

  6. C语言每日一题之No.7

    今天是正式第一天在现有的世界里与自己相处,你再也没有另一个世界可以躲避了.终于要自己面对自己了,一个人要真实的面对自己的灵魂总是痛苦的.从学校到社会的环境转换,现实与理想的冲突,个人价值观和社会价值观 ...

  7. C语言每日一题之No.6

    人总要战胜内心的懦弱的,我不能一直这么缩在里边.终究向自己发出了挑战,还是会伤心的时候,发愣的时候.如果可以,我也希望像盗梦空间的女主一直沉在两个人的梦里永远不要醒来.可是,我们谁又能抗拒时间呢?这雨 ...

  8. C语言每日一题之No.5

    总在想,但凡编程基础正常点,都不至于惨败到这个地步.也像大多数人毕业出来,新鲜的第一份工作,如果做得好还可以略有成就感,做得一般还有提升的空间,但至少不至于像我这样基本没基础的被鄙视得一塌糊涂,被外界 ...

  9. C语言每日一题之No.2

    题目:已知三个整型数8,12,6,按公式s=a+b*c计算,并显示结果 思路:定义三个整型变量a,b,c 定义一个变量s用来保存运算结果 输出 程序: #include <stdio.h> ...

随机推荐

  1. 学习iOS笔记第一天的C语言学习记录

    c语言基础学习 int num1 = 15; int num2 = 5; int temp = 0; //先把num1放到temp里 temp = num1; //先把num2放到num1里 num1 ...

  2. 学习iOS的一些网站收藏

    1,CocoaChina:http://www.cocoachina.com/ 2,Code4App:http://code4app.com/ 3,梦维:http://www.dreamingwish ...

  3. Linux中“新旧”TCP/IP工具的对比

    如今很多系统管理员依然通过组合使用诸如ifconfig.route.arp和netstat等命令行工具(统称为net-tools)来配置网络功能.解决网络故障,net-tools起源于BSD的TCP/ ...

  4. scala言语基础学习七

    一.将函数赋值给变量 二.匿名函数 三.高阶函数 高阶函数好像调用不打印是看不到赋值 和普通函数区别 高阶函数的类型推断 reduce操作 相当于1*2*3*4*5*6*7*8*9 def getNa ...

  5. Linux shell编程札记

    if-then的高级特性 [[]].[]都是用来测试( 测试分为数值比较.字符串比较.文件比价 )的,[[]]是关键字,里面可以用&&.||.<.>等类似C语言的语法:[] ...

  6. Java——银行业务调度系统

     需求: 模拟实现银行业务调度系统逻辑,具体需求如下: Ø 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口. Ø 有三种对应类型的客户:VIP客户,普通 ...

  7. 黑马程序员——JAVA基础之final this.和super.的区别

    ------- android培训.java培训.期待与您交流! ----------  final关键字: final可以修饰类,方法,变量. final修饰的类不可以被继承. final修饰的方法 ...

  8. 关于CPU Cache -- 程序猿需要知道的那些事

    本文将介绍一些作为程序猿或者IT从业者应该知道的CPU Cache相关的知识 文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢钧轶(cenalulu) 本文原文地址:http://ce ...

  9. android屏蔽软键盘并且显示光标

    if (android.os.Build.VERSION.SDK_INT <= 10) {//4.0以下 danielinbiti editText.setInputType(InputType ...

  10. 018. ADO.NET _DataSet_DataAdapter

    DataSet对象是支持ADO.NET的断开式或分布式数据方案的核心对象; DataAdapter对象是一种用来充当DataSet对象与实际数据源之间的桥梁 的对象, 所以二者结合访问数据库中数据模式 ...