C语言程序设计——在字符串S1查找字符串S2出现次数的函数
20 [ 标签:c语言, 程序设计, 字符串函数 ] 浪仙 2009-04-30 10:22
在字符串S1查找字符串S2出现次数的函数。
功能需求 1) 输入的两个字符串S1和S2。
2)查找S2在字符串S1中出现的次数和位置。
3) 输入字符串S3,将在S1中的出现的字符串S2都替换成S3。
4) 如果S1中不含有S2,则找出在S2中能被S1包含的所有子字符串,并指出其中长度最大和最小的子字符串
用户界面 输入: 程序正常运行后,屏幕上显示一个文字菜单(根据序号选定相应的操作项目),当用户选定操作项目所对应的序号时,根据应用程序的提示信息,从键盘上输入相应的数据。
输出: 1) 应用程序正常运行后,要在屏幕上显示一个文字菜单
2) 要求用户输入数据时,要给出清晰、明确的提示信息,包括输入的数据内容、格式及结束方式等(提示与参考 输入样例 输出样例)
问题补充:前三步已经解决了,第四步:“如果S1中不含有S2,则找出在S2中能被S1包含的所有子字符串,并指出其中长度最大和最小的子字符串”还没有解决!课程设计答辩要用,时间不多了,很急啊!各位高手帮帮忙啊!
满意答案 好评率:100%
字符串匹配问题,到网上,找KMP算法就行了。有现成代码的。
继续追问: 我已经把下面两部编出来了,【1) 输入的两个字符串S1和S2。 2)查找S2在字符串S1中出现的次数和位置。】第三步【3) 输入字符串S3,将在S1中的出现的字符串S2都替换成S3。】单独出来也编写出来了,现在就剩下怎样把第三步和前两步合在一起还有第四步目前写不出来,希望你能帮忙一下!
下面1和2步代码:
#include <stdio.h>
#include <string.h>
main()
{ int i=0,j=0,position=0;
int occur=0;
char s1[100],s2[50],s3[50];
printf("please input three strings\n");
printf("S1: \n");
scanf("%s", s1);
printf("s2: \n");
scanf("%s",s2);
printf("s3:\n");
scanf("%s",s3);
while(s1[j]!='\0')
{ if ((s1[j]==s2[i])&&(s2[i]!='\0'))
{ i++; j++; }
else
j++;
if (s2[i]=='\0')
{ occur++;
position=j-i+1;
printf("\nPositions found at :%d ",position);
position=0;
i=0; }
}
printf("\nNumber of occurances: %d.\n", occur);
}
继续追问: 下面是独立出来第三步的代码:有没有办法改写下面代码和1,2步代码合并起来一起运行
#include <stdio.h>
#include <string.h>
main()
{
void replace(char *s1,char *s,char *s2,char *s3);
static char s1[100]="abcefababcdabab";
static char s[100];
replace(s1,s,"abc","XYZ");
printf("%s\n",s);
}
void replace(char *s1,char *s,char *s2,char *s3)
{char *t0,*x,*y;
while(*s1!='\0')
{
x=s2;
if(*s1==*x)
{for(t0=s1,x=s2;(*t0==*x&&*x!='\0');t0++,x++)
{*s++=*s1++;
if(*(x+1)=='\0')
{
s-=strlen(s2);
for(y=s3;*y!='\0';)
*s++=*y++;
}
}
}
else
*s++=*s1++;
}
*s='\0';
}
补充回答: #include<stdio.h>
#include<string.h>
char s1[100],s2[100],s3[100];
int a[100],num;
void Input()
{
int i,k,p;
char ans[100][100];
int len[100];
int n,m;
int min,mas,minp,masp;
printf("请输入s1,s2:\n");
scanf("%s%s",&s1,&s2);
num=0;
n=0;
for(m=0;s1[m]!='\0';m++);
for(i=0;i<m;i++)
{
if(s2[0]==s1[i])
{
p=1;
for(k=0;s2[k]!='\0';k++)
{
if(s1[k+i]=='\0'||s1[k+i]!=s2[k]) {p=0;break;}
ans[n][k]=s1[k+i];
}
ans[n][k]='\0';
len[n]=k;
n++;
if(p) {a[num]=i+1;num++;i=i+k-1;}
}
}
if(num==0)
{
min=mas=len[0];
minp=masp=0;
printf("s2中能被s1包含的所有子字符串是:\n");
for(i=1;i<n;i++)
{
printf("%s\n",ans[i]);
if(min>len[i]) {min=len[i];minp=i;}
if(mas<len[i]) {mas=len[i];masp=i;}
}
printf("长度最大的是%s\n",ans[masp]);
printf("长度最小的是%s\n",ans[minp]);
}
补充回答: else
{
printf("s2在s1中出现了%d次\n",num);
printf("在s1的位置分别是:");
for(i=0;i<num;i++)
{
printf(" %d",a[i]);
}
printf("\n");
}
}
void Output()
{
int i,j,m;
printf("请输入s3:\n");
scanf("%s",&s3);
j=0;
for(i=0;i<num;i++) printf("%d ",a[i]);printf("\n");
for(m=0;s2[m]!='\0';m++);
for(i=0;s1[i]!='\0';i++)
{
if(j<num&&i+1==a[j])
{
j++;
printf("%s",s3);
i=i+m-1;
continue;
}
printf("%c",s1[i]);
}
}
main()
{
int t;
do
{
printf("1)输入两个字符串s1和s2\n");
printf("2)输入字符串s3,将在s1中的出现的字符串s2都替换成s3\n");
printf("0)退出\n");
printf("请输入:");
scanf("%d",&t);
if(t==1) Input();
if(t==2) Output();
printf("\n");
}while(t!=0);
}
继续追问: 呵呵,我现在也能实现了!不过好像你的代码功能会好一点,现在前三步能够实现了,还剩下第四步了到目前为止我都还不能实现,你能不能帮忙一下啊!很急啊!课程设计答辩要用的,时间不多了!帮帮忙啊!
#include <stdio.h>
#include <string.h>
main()
{
void replace(char *s1,char *s,char *s2,char *s3);
int count(char *s1,char *s2);
char s1[100],s2[50],s3[50];
int occur=0;
char s[100];
printf("please input three strings\n");
printf("S1: \n");
gets(s1);
printf("S2: \n");
gets(s2);
printf("S3: \n");
gets(s3);
occur=count(s1,s2);
replace(s1,s,s2,s3);
printf("%s\n",s);
printf("\nNumber of occurances: %d.\n", occur);
}
继续追问: void replace(char *s1,char *s,char *s2,char *s3)
{char *t0,*x,*y;
while(*s1!='\0')
{
x=s2;
if(*s1==*x)
{
for(t0=s1,x=s2;(*t0==*x&&*x!='\0');t0++,x++)
{
*s++=*s1++;
if(*(x+1)=='\0')
{
s-=strlen(s2);
for(y=s3;*y!='\0';)
*s++=*y++;
}
}
}
else
*s++=*s1++;
}
*s='\0';
}
int count(char *s1,char *s2)
{
int i=0,j=0;int occur=0;int position=0;
while(s1[j]!='\0')
{
if((s1[j]==s2[i])&&(s2[i]!='\0'))
{
i++; j++;
}
else
j++;
if (s2[i]=='\0')
{
occur++;
position=j-i+1;
printf("\nPositions found at :%d \n",position);
position=0;
i=0;
}
}
return occur;
}
继续追问: 4) 如果S1中不含有S2,则找出在S2中能被S1包含的所有子字符串,并指出其中长度最大和最小的子字符串
这一步要怎么办啊,想了几天都编不出来啊,能不能帮忙解决一下。很急啊,课程设计答辩要用啊,时间不多了,帮帮忙啊!急!急!
补充回答: 我上面程序已经实现你说的这种功能了。。
继续追问: 呵呵,谢谢!