- 真可
-
可以编写子函数,将复杂的处理过程分解开来,这样就可以保证思路清晰,出错率低,而且便于查错和维护。
大体过程如下:
主函数中设置一个循环,用子串的首字符从主串的开头检索到尾,如果检索到则调用子函数,剩下的工作就由子函数完成。
在子函数中,将判断子串剩下的字符是否与主串相符。用一个循环即可,遇到不相符的字符则返回;若判断成功,即主串中的字符与子串完全相符,则将该子串位置赋给一个指针数组,并计数,然后返回。
大体就是这样,其中要传递一些参数,子函数体类似如下:
void sub(char mainstr[],char substr[],int pos);
mainstr[]是主串,substr[]是子串,pos是当前检索位置。
要是还不明白,我再详细说。
- 再也不做稀饭了
-
以下是KMP高效查找法。
效果:
主串是: abccsdmaascvjereikavsabcasetabcddabcdfefswabc
子串是: abc
第1次出现,位置是0
第2次出现,位置是21
第3次出现,位置是28
第4次出现,位置是33
第5次出现,位置是42
共出现了5次
#include <stdio.h>
#include <stdlib.h>
#ifndef __cplusplus
#define const
#endif
int strlen(const char *str)
{
int i=0;
while(*str++) i++;
return i;
}
// 求得模式串的next值
int* KMPGetNext(const char*str,int *pLen)
{
int *pNext = NULL;
int length = strlen(str);
if(pLen) *pLen = length;
pNext =(int*)malloc(length*sizeof(int));
int i = 0;
int j = -1;
pNext[0] = -1;
while(i<length)
{
if(j==-1||str[i]==str[j])
{
i++; j++;
if(i>=length) break;
if(str[i]!=str[j]) pNext[i] = j;
else pNext[i] = pNext[j];
}
else
{
j = pNext[j];
}
}
return pNext;
}
int KMPStrIndexEx(const char *mainstr,const char *substr,int pos,int *next)
{
int mainlen=strlen(mainstr);
int sublen =strlen(substr);
int i,j;
i = pos;
j = 0;
while(i<mainlen&&j<sublen)
{
if(j==-1||mainstr[i]==substr[j])
{
i++;j++;
}
else
{
j=next[j];
}
}
return j>=sublen?i-sublen:-1;
}
int KMPStrIndex(const char *mainstr,const char *substr,int pos)
{
int *next = KMPGetNext(substr,NULL);
int inpos = KMPStrIndexEx(mainstr,substr,pos,next);
free(next);
return inpos;
}
int main()
{
/*仅仅是测试*/
char *str="abccsdmaascvjereikavsabcasetabcddabcdfefswabc";
char *sub="abc";
/*求next值*/
int length;
int *next=KMPGetNext(sub,&length);
int count=0;
int pos=0;
printf("主串是: %s ",str);
printf("子串是: %s ",sub);
while((pos=KMPStrIndexEx(str,sub,pos,next))!=-1)
{
count++;
printf("第%d次出现,位置是%d ",count,pos);
pos+=length;
}
printf("共出现了%d次 ",count);
free(next);
return 0;
}
- LuckySXyd
-
#include "stdio.h"
int findstr(char *str,char *substr) //用于查找字符出现次数的函数
{char *p;char *s;int i=0;
p=str; //p为主字符串
s=substr; //s为被查字符串
while(*p) //到p尾了,循环结束
{
if(*s==*p){s++;p++;} //如果当前p串的字符与s字符一致,查看下一字符是否一致
else {p++;s=substr;} //如果不一致,s串复原,p串继续前进,等待下一次对比
if(*s==" ") {i++;s=substr;} //如果到s串尾了,说明上面的对比完成,合符条件i++,同时复原s等待下一次对比
}
return i;
}
void main()
{char str[81],substr[8];int i;
printf("请输入一列字符串");
gets(str);
printf("请输入要查找的字符串");
gets(substr);
i=findstr(str,substr);
printf("%d",i);
}
vc6.0运行成功!祝你好运!该段代码只用了一个循环,应该不难看懂了。
- 蓓蓓
-
一:获取子串的长度:superset_long=?,subset_long=?
定义n=1,m=1;degree=0;
二:若n<=superset_long,则读取字符串的第n个字符,将字符赋值给变量char_n;否则结束循环,return degree的值;
三:读取子串的第m个字符,赋值给char_m;
四:验证m==string_long,是则degree++,n++,m=1,返回第二步
char_n==char_m且m<char_n;则,n++,m++,返回第二步
若char_n!=char_m,则m=1,返回第二步
还是楼上的办法比较清晰~~~学习ing
- 阿啵呲嘚
-
#include<stdio.h>
int find_str(char *s,char *c,char *p[])
{
/*
s 父串
c 字串
p 出现位置也 赋给一个指针数组
*/
int i,j,k;
int s_len,c_len;/*父,子串长度*/
int find=0;
s_len = strlen(s);
c_len = strlen(c);
for(i=0;i<s_len;i++)
{
k = 0;
for(j=i;j<s_len && k<c_len;j++,k++)
{
if(*(s+j)==*(c+k))
continue;
else
break;
}
if(k>=c_len) /*比较全部相等是字串*/
{
p[find] = s+i; /*位置也 赋给一个指针数组*/
find++; /*出现个数加 1*/
}
}
return find;
}
void main()
{
char *s = "sabowmwabab,,abd";
char *c = "ab";
int find;
char *p[100];
find = find_str(s,c,p);
printf(""%s"在"%s"出现的个数为%d",c,s,find);
}
- 北境漫步
-
用堆分配存储表示:
typedef struct{
char *ch;
int length;
}HString;
函数为:
int numstr(HString s, HString t){/*查找串t在s中出现的不重叠次数*/
int i, j = 0, n, tag=0;
if(s.length<t.length) ERROR();
for(i = 0; i < s.length && j < t.length; i++,j++)
if(s.ch[i]==t.ch[j])
if(j==t.length-1) tag=1;
if(tag==1){
tag = 0; n++; j = 0;
}
}
return n;
}
- S笔记
-
简单的做了一下,如果满意请给分:)
#include "stdio.h"
#include "conio.h"
void main()
{
char p[100],q[20];
char *flag[50];
int i=0,j=0,k=0;
int count=0;
printf("请输入字符串: ");
scanf("%s",p);
printf("请输入要查找的子串: ");
scanf("%s",q);
for(i=0;p[i]!=" ";i++)
{
if(p[i]==q[0])
{
for(k=0;q[k]!=" ";k++)
{
if(p[i+k]!=q[k])
{
break;
}
}
if(q[k]==" ")
{
count++;
flag[count-1] = p+i;
}
}
}
printf("符合的子串个数为:%d ",count);
getch();
}
- 黑桃云
-
太麻烦了。祝福你