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:\n");
12 gets(FatherStr);
13 printf("Please input the sub string:\n");
14 gets(SubStr);
15 cnt = findstr(FatherStr,SubStr);
16 printf("the count is:%d\n",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:\n");
12 gets(FatherStr);
13 printf("Please input the sub string:\n");
14 gets(SubStr);
15 cnt = findstr(FatherStr,SubStr);
16 printf("the count is:%d\n",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]!=‘\0‘;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个\n",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]=‘\0‘;
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了,睡觉,睡觉,睡觉~_~

C语言每日一题之No.8

时间: 2024-10-22 07:53:25

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

C语言每日一题之No.9

再做决定之前,我还是做好自己该做的.我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦.尊敬的女王陛下,请接题: 一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规则插到字符串a中,最后输出"abdefghjkmnptwy". 二.思路:既然是已经排好序的,就用二分法查找的思想 将字符串s中的每个字符依次作为key拿来和字符串a做比较并且插入 三.程序 1 #include <stdio.h> 2 #include <string.

C语言每日一题之No.3

题目:从键盘输入一个字符串,按照字符顺序从小到大进行排序,并要求删除重复字符.如输入"ad2f3adjfeainzzzv",则输出"23adefijnvz" 思路:先定义一个字符数组用来存储字符串 讲数字转化成字符(ASCII) 排序 进行遍历,删除重复字符 程序: C语言每日一题之No.3,布布扣,bubuko.com

C语言每日一题之No.1

鉴于在学校弱弱的接触过C,基本上很少编程,C语言基础太薄弱.刚好目前从事的是软件编程,难度可想而知.严重影响工作效率,已无法再拖下去了.为此,痛下决心恶补C语言.此前只停留在看书,光看好像也记不住,C这东西毕竟是练出来的,所以从今天开始,每日一道C语言题目,从题目入手来补知识漏洞.题目比较基础,如不堪入目,还请见谅. 题目:输入三个整数,输出最大的数 思路:定义三个变量用来存储输入的整数 比较三个变量的大小,找到最大的数 定义一个变量存储来存储最大的数 程序: 1 #include <stdio

C语言每日一题之No.2

题目:已知三个整型数8,12,6,按公式s=a+b*c计算,并显示结果 思路:定义三个整型变量a,b,c 定义一个变量s用来保存运算结果 输出 程序: 1 #include <stdio.h> 2 3 void main() 4 { 5 int a = 8; 6 int b = 12; 7 int c = 6; 8 int s = 0; 9 10 s = b*c ; //s用来保存b*c 11 s += a; //s=a+b*c 12 printf("a+b*c=%d\n"

C语言每日一题之No4.

这几天老大也没安排我什么项目,于是想正好趁着空补C.当然,是利用晚上加班时间,白天正常上班时间还是学习公司的平台. 今儿个突然弱弱的感觉到在公司补C是件很低级的事情,哪怕是在加班时间都会被喷,因为大家在关心Linux玩得顺溜不顺溜的情况下,我在补C,万恶的C.想想也是,这种最最基础的C语言只能自己挤出时间来补了,在公司最起码也得学点高端点的,比如Linux,如果作为一个软件开发人员,你不会Linux还搞毛线啊? 好吧,工作一天了,今日吐槽完毕,人生因吐槽而舒畅爽快 ,神一样的存在.此时此刻就是回

C语言每日一题之No.7

今天是正式第一天在现有的世界里与自己相处,你再也没有另一个世界可以躲避了.终于要自己面对自己了,一个人要真实的面对自己的灵魂总是痛苦的.从学校到社会的环境转换,现实与理想的冲突,个人价值观和社会价值观的矛盾,这些都很大程度的冲击着我,不行,我不可以被这些所俘虏失去自我,我得重新把自己给找回来.如果不重新学会和自己相处,那我又该以怎样的姿态活着?如果内心无法认可自己,那我活着有什么意义?虽然过程有点痛苦,可心里很踏实,因为自己没有被外界的评价所绑架,而是牢牢的和自己的灵魂紧密相拥.girl ,加油

C语言每日一题之No.5

总在想,但凡编程基础正常点,都不至于惨败到这个地步.也像大多数人毕业出来,接受任务,如果做得好还可以略有成就感,做得一般还有提升的空间,但至少不至于像我这样基本没基础的被鄙视得一塌糊涂,被外界持续的否定,直到你也开始觉得,你存在的意义何在?可是这又怎样呢?事实已经如此了,那就努力改善!没有假如,没有如果,没有任何人可以替你来努力.今天去看了赵星的微博,很励志.有一段话藉以共勉:人总要付出很大努力才会让别人觉得毫不费力,世上没有白挣的钱,没有白付出的辛苦,只有没下够的功夫和没坚持的勇气,而功夫下在

老男孩教育每日一题-第94天 -shell脚本知识点:对shell脚本进行加密

题目 用shell脚本对系统进行自动化维护,简单,便捷而且可移植性好.但shell脚本是可读写的,很有可能会泄露敏感信息,如用户名,密码,路径,IP等.同样,在shell脚本运行时会也泄露敏感信息.请问如何不影响脚本运行的前提下,对脚本进行加密 答案参考: 方法一:shc shc是一个加密shell脚本的工具.它的作用是把shell脚本转换为一个可执行的二进制文件.shc 安装yum -y install shc使用方法:shc -r -f script-name 注意:要有-r选项, -f 后

老男孩教育每日一题-2017年5月11-基础知识点: linux系统中监听端口概念是什么?

1.题目 老男孩教育每日一题-2017年5月11-基础知识点:linux系统中监听端口概念是什么? 2.参考答案 监听端口的概念涉及到网络概念与TCP状态集转化概念,可能比较复杂不便理解,可以按照下图简单进行理解? 将整个服务器操作系统比喻作为一个别墅 服务器上的每一个网卡比作是别墅中每间房间 服务器网卡上配置的IP地址比喻作为房间中每个人 而房间里面人的耳朵就好比是监听的端口 当默认采用监听0.0.0.0地址时,表示房间中的每个人都竖起耳朵等待别墅外面的人呼唤当别墅外面的用户向房间1的人呼喊时