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