字符串匹配问题:输入一个字符串,计算其中包含的连续给定的子字符串的个数。
例如输入字符串“ EFABCABCABCDABCDD ” , 给定子字符串“ ABC” ,输出是 3 。
函数原型: int countsub( char *str, char *subs ) 。
参数说明: str 保存输入的字符串的首地址, subs 保存需要统计的子字符串的首地址。
返回值:包含的连续子字符串的个数
分析:根据题意我们主要需要解决两个问题:
1.如何去找到原字符串中的子字符串
2.原字符串中“连续”的子字符串个数
#include<stdio.h>
int countsub( char *str, char *ss )
{
int count = 0, i = 0;
//count用来计算子字符串的个数,i用来计算连续的子字符串个数
char *p = str, *q = ss;
while( *p != '\0')
{
q = ss; //每次都要初始化q指针,让它指向ss的第一个元素
if(*p == *q)//判断p,q指针指向的元素是否相等
{
while( *p++ == *q++ )//判断相等并且p,q向后移一位
{
if( *q == '\0')//当q指向最后'\0'时,就初始化q
{
q = ss;
count++;
//并且说明原字符串含有一个子字符串 count+1
}
}
if( i <= count)
//这里是判断所求子字符串个数是否为最多的一个
{
i = count;
count = 0;
}
}
else //如果p,q指向的元素不同,p向后移一位
p++;
}
return i; //返回i 的值
}
int main()
{
char s1[1000] = {0}, s2[100] = {0};
gets(s1); //输入原字符串
gets(s2); //输入子字符串
printf("%d\n", countsub( s1, s2 ));
return 0;
}