我用一个实例来给你说明一下吧。假如,传进去的参数
创新互联服务项目包括鹤峰网站建设、鹤峰网站制作、鹤峰网页制作以及鹤峰网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,鹤峰网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到鹤峰省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
str="abaab"
substr="ab"
那么预期的结果函数应该返回2。
下面我们来看一下具体的过程:
首先,定义一些变量,n是统计子串出现次数的,初始化为0;
p,r是指向char类型的指针;
然后开始遍历源字符串str,即while语句:
while(*str) 循环退出的条件是str指向了源串的末尾
进入循环后,把源串和子串的指针分别赋给p和r
接下来的一个while(*r) 就是遍历子串substr,同样循环退出的条件是r指向了子串的末尾
这个循环体只有一句话:
if(*r==*p){ r++;p++}
else break;
即如果子串的第一个字符和源串的一个字符相同,那么子串和源串两个指针都向后移动一个,
然后继续while(*r)的循环
对这个实例来说,这是r指向‘a’,p也指向'a',那么条件成立,p 和r都向后移动一位,继续
比较,这时r指向了b,p也指向了'b',条件又成立,p和r再都向后移动一位,这时r已经指向了
末尾,所以while循环的条件判断不成立,循环结束,
跳出来判断一下if(*r=='\0') 成立,表示刚才循环跳出是因为找到一个匹配的子串,所以n
计数器加1,str也指向下一个字符'b'
回到最初的循环后p指向了'b',r又重新指向了'a',这时while(*r)进入后判断条件不成立,所以立即退出循环,这时由于r还没有指向末尾,所以退出循环后的if语句条件不成立,n不会增加;
str仍然指向下一个字符;
依次类推,当str遍历每一个源串的字符时,n就记录了子串出现的次数。
他说的是字串出现的次数
合理 怎么不合理呢?
这类型的题 说字串 意思都是 只要能匹配不在同一位置的就算
这个不是把字串拿走 只是比较
// 这里提供一个在字符串中查找字串的函数findstr(),并由运行截图,供参考。
#include stdio.h
int findstr(char *s,char *d) {
char *p = s,*q;
int i;
while(*p) {
i = p - s;
q = d;
while(*p == *q) { p++; q++; }
if(*q == '\0') return i;
p = s + (++i);
}
return -1;
}
int main() {
char *s = "精品办公水杯";
char *d = "杯";
int result = findstr(s,d);
if(result = 0) printf("【%s】在【%s】中的索引位置是:%d。\n\n",d,s,result);
else printf("没找到。\n\n");
return 0;
}
返回该字符串的首地址,用char*表示,如果不存在,则返回空指针NULL
#includestdio.h
#includestring.h
int findstr(char *s_str,char *d_str);
int main(void) {
char s1[80],s2[80];
int n;
printf("请输入一个字符串:");
gets(s1);
printf("请输入你要查找的字符串:");
gets(s2);
n=findstr(s1,s2);
printf("%s在%s里共有%d个\n",s2,s1,n);
return 0;
}
int findstr(char *s_str,char *d_str) {
int i,j,k,count=0;
char temp[80];
int length=strlen(d_str);
for(i=0;istrlen(s_str);i++) {
k=0;
for(j=i;ji+length;j++)
temp[k++]=s_str[j];
temp[k]='\0';
if(!strcmp(temp,d_str)) count++;
}
return count;
}
#includereg51.h
#define GPIO_DIG P0//这个意思是用GPIO_DIG来代替P0,后面只要出现了GPIO_DIG就是指P0 sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char DisplayData[8];
void DigDisplay(); //这里是一个子函数的名字告诉单片机你的代码里有个叫DigDisplay的子函数 void main(void)// 必须这样,man函数是非常必要无可替代的。
{
unsigned char i;
for(i=0;i8;i++)
{
DisplayData[i]=DIG_CODE[i];//i可以去任意值 比如DisplayData[1]=DIG_CODE[1] }
while(1)
{
DigDisplay();
}
}
void DigDisplay()
{
unsigned char i;
unsigned int j;
for(i=0;i8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;
case(1):
LSA=1;LSB=0;LSC=0; break;
case(2):
LSA=0;LSB=1;LSC=0; break;
case(3):
LSA=1;LSB=1;LSC=0; break;
case(4):
LSA=0;LSB=0;LSC=1; break;/
case(5):
LSA=1;LSB=0;LSC=1; break;
case(6):
LSA=0;LSB=1;LSC=1; break;
case(7):
LSA=1;LSB=1;LSC=1; break;
}
GPIO_DIG=DisplayData[i];//段码就是让数码管显示阿拉伯数字的一个码制,1~9 码制不一样
j=10;
while(j--);
GPIO_DIG=0x00;//消隐的意思是当显示完一个数字后要对段码清零不然你肉眼会看到数码管拖着个影子一样有点模糊,做了消隐处理看起来就会很清晰
}
}