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
三.程序
#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的更多相关文章
- C语言每日一题之No.1
鉴于在学校弱弱的接触过C,基本上很少编程,C语言基础太薄弱.刚好目前从事的是软件编程,难度可想而知.严重影响工作效率,已无法再拖下去了.为此,痛下决心恶补C语言.此前只停留在看书,光看好像也记不住,C ...
- C语言每日一题之No.9
再做决定之前,我还是做好自己该做的.我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦.尊敬的女王陛下,请接题: 一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规 ...
- C语言每日一题之No.4
这几天老大也没安排我什么项目,于是想正好趁着空补C.当然,是利用晚上加班时间,白天正常上班时间还是学习公司的平台. 今儿个突然弱弱的感觉到在公司补C是件很低级的事情,哪怕是在加班时间都会被喷,因为大家 ...
- C语言每日一题之No.3
几天下来,感慨学习要坚持下来真的是件很难的事,本来说了每天一题,可是毕竟这是个细活,需要用心雕琢,有时候真的不能当天拿下来>_<.虽然说只是一题,却涉及到很多小细节,慢慢的琢磨直至完全摸透 ...
- C语言每日一题之No.12
文件操作知识:如何将一个文件的内容读取到另一个文件里? fread函数和fwrite函数 1.函数功能 用来读写一个数据块. 2.一般调用形式 fread(buffer,count,siz ...
- C语言每日一题之No.7
今天是正式第一天在现有的世界里与自己相处,你再也没有另一个世界可以躲避了.终于要自己面对自己了,一个人要真实的面对自己的灵魂总是痛苦的.从学校到社会的环境转换,现实与理想的冲突,个人价值观和社会价值观 ...
- C语言每日一题之No.6
人总要战胜内心的懦弱的,我不能一直这么缩在里边.终究向自己发出了挑战,还是会伤心的时候,发愣的时候.如果可以,我也希望像盗梦空间的女主一直沉在两个人的梦里永远不要醒来.可是,我们谁又能抗拒时间呢?这雨 ...
- C语言每日一题之No.5
总在想,但凡编程基础正常点,都不至于惨败到这个地步.也像大多数人毕业出来,新鲜的第一份工作,如果做得好还可以略有成就感,做得一般还有提升的空间,但至少不至于像我这样基本没基础的被鄙视得一塌糊涂,被外界 ...
- C语言每日一题之No.2
题目:已知三个整型数8,12,6,按公式s=a+b*c计算,并显示结果 思路:定义三个整型变量a,b,c 定义一个变量s用来保存运算结果 输出 程序: #include <stdio.h> ...
随机推荐
- 腾讯优测干货精选| 安卓开发新技能Get -常用必备小工具汇总
文/腾讯公司 陈江峰 优测小优有话说: 移动研发及测试干货哪里找?腾讯优测-优社区你值得拥有~ 开发同学们都知道,安卓开发路上会碰到很多艰难险阻,一不小心就被KO.这时候,没有新技能傍身怎么行?今天我 ...
- 菜鳥日記:為 Github 添加 ssh
這只是一篇求真務實言簡意賅的菜鳥日記 記錄了碼盲在OSX 中為Github添加 ssh 的過程 要從 Github 上克隆個源碼到本地,發現無 ssh 密鈅 於是開到官網幫助照貓畫虎如下: 1.打開 ...
- html部分---通用标签与属性;
body的属性: bgcolor页面背景色:text文字颜色:topmargin上页边距:leftmargin左页边距:rightmargin右页边距:bottomargin下页边距: src是引用过 ...
- hihoCoder挑战赛23
hihoCoder挑战赛23 A.Emulator 题意 给一张图,有\(N(N \le 300)\)个点, 给出任意两点之间的最短路. 求最多可以去掉多少条边,使得任意两点的最短路长度不变. 思路 ...
- phpwind8.7升级9.0.1过程(二)8.7正式升级9.0
首先备份 1. 给本地做备份将网站根目录下面的所有文件先做备份. 2. 给本地数据库做备份 3. 了解升级的具体过程 phpwind8.7升级到9.0需要首先升级到phpwind9.0的原生版本即:2 ...
- 课堂所讲整理:HTML--5JavaScript简介
一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...
- poj3553 拓扑序+排序贪心
题意:有多个任务,每个任务有需要花费的时间和最后期限,任务之间也有一些先后关系,必须先完成某个才能开始某个,对于每个任务,如果没有越期,则超时为0,否则超时为结束时间-最后期限,求总超时时间最小的任务 ...
- kuangbin_ShortPath L (POJ 2502)
dij部分还是跟模板差不多的 但是这题的难点是处理输入 或者说理解题意 事实上每个点之间都是可以走的......WA了好几发就因为没意识到同一条路线上的各个站点之间居然也可以走得比车子快.... PS ...
- 浅谈开源项目Android-Universal-Image-Loader(Part 3.1)
本文转载于:http://www.cnblogs.com/osmondy/p/3266023.html 浅谈开源项目Android-Universal-Image-Loader(Part 3.1) 最 ...
- Android 编程下去除 ListView 上下边界蓝色或黄色阴影
默认的情况下,在 ListView 滑动到顶部或者是底部的时候,会有黄色或者蓝色的阴影出现.在不同的版本上解决的方法是不同的,在 2.3 版本之前可以在 ListView 的属性中通过设置 andro ...