求高手用C语言编写 计算某个字符串中子字符串的输入个数数,其中字符串由(scanf或gets函数输入)

举个例子:输入字符串 x y x x z y x 要统计的子字符串为 x y 输入个数为 1
2025-01-05 08:20:49
推荐回答(3个)
回答1:

不多说了:
测试结果:
请输入母串:
xyxyxyzzzxyzzzxyxyxy
请输入要统计的子串:
xy
出现的个数为:7

正确代码:
#include"stdio.h"
#include "conio.h"
#include "stdio.h"
#include "math.h"
#include "string.h"

int result=0;
char pat[20];
char str[256];
int next[7];

void getNext(char pat[], int next[])
{
int j = 0;
int k = -1;
next[0] = -1;
while (pat[j])
{
if ( k == -1 || pat[j] == pat[k])
{
j++;
k++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
int KMP(char *str, char*pat, int *next)
{
int i=0,j=0;
while(str[i])
{
if(pat[j]==0)
return i-j;
if(j==0 || str[i]==pat[j])
{
++i;
++j;
}else
j=next[j];
}
if(pat[j]==0)
return i-j;
return -1;
}

void strcopy(char a[],char b[],int k)
{
int count=0;
while(a[k]!='\0')
{
b[count]=a[k];
k++;
count++;
}
b[count]='\0';
}

int main(int argc, char* argv[])
{
int i,lenM,lenS,count=0,lastexit=0;
char strbak[256];
printf("请输入母串:\n");
scanf("%s",str);
printf("请输入要统计的子串:\n");
scanf("%s",pat);
lenM=strlen(str);
lenS=strlen(pat);

for(i=0;i {
if(lastexit==1)
{
strcopy(str,strbak,i+lenS+result-1);
i=i+lenS+result-1;
}
else
{
strcopy(str,strbak,i);
}
getNext(pat,next);
result=KMP(strbak,pat,next);
if(result!=-1)
{
count++;
lastexit=1;
}
else
{
lastexit=0;
}
}
printf("出现的个数为:%d \n",count);

getch();
return 0;
}

PS:不考虑
xxxxxxxxxxxx
与xx重复匹配的问题。要考虑的话,楼主可以把算法稍微改动一下。【字符串每次后移一个,取后面的全部进行匹配。】

匹配算法:KMP算法, 测试代码:Negamax原创!

楼主好运!

回答2:

#include
#include

void main()
{

int a = 0, p = 0,q=0,i,m=0,n;
char j[100],s[100],k[100];
printf("请输入一个字符串:");
gets(s);
printf("请输入子字符串:");
gets(j);
p = strlen(s);
q=strlen(j);
for (a = 0; a < p-1; a++)
{
n=-1;
if (s[a]==j[0])
{
for(i=1;i {
if(s[i+a]==j[i])
n=1;
}
if(n==1)
m++;

}
}
printf("出现的次数为:%d\n",m);

}

LZ,改好了,现在遇到空格也行了,望采纳

回答3:

#include
#include
void main ( )
{
char str1[100],str2[100],str3[100];
int num=0,length=0;
printf("请输入字符串:\n");
gets(str1);
printf("请输入匹配子字符串:\n");
gets(str2);
length=strlen(str2);
for(int i=0;str1[i]!='\0';i++)
{ int m,n;
for(m=0,n=i;m {
str3[m]=str1[n];
}
str3[length]='\0';
if(strcmp(str2,str3)==0) num++;
}
puts(str2);
printf("\n匹配个数为:%d\n",num);
}