C语言算法查找字符串在文中出现的次数Word格式文档下载.docx
《C语言算法查找字符串在文中出现的次数Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C语言算法查找字符串在文中出现的次数Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
3.输入一个,检索并输出在文本中出现的行号和该行中的相应位置
三.数据结构
1.子函数设计:
(1).voidget_next(SStringT,intnext[])
//求next值
(2).intIndex(SStringS,SStringT,intpos)//KMP算法
(3).voidfind(charname[],SStringkeys)//查找函数
2.主函数调用设计:
intmain()//主函数
3.结构设计:
#defineMAXSTRLEN255
//最大串长
typedefcharSString[MAXSTRLEN+1];
//串的定长顺序存储表示
intnext[MAXSTRLEN]//KMP算法中用到的next
四.算法设计思想及流程图
主函数设计:
intmain()
{
charname[50];
//存储输入的小说路径字符串
SStringwords[10];
//定义字符串数组,用于存储输入的关键字
intn,i;
printf("
Pleaseinputthenameofthenovel:
\n"
);
scanf("
%s"
name);
Howmanywordsdoyouwanttofind?
(n<
10)\n"
%d"
&
n);
Pleaseinputthewordsyouwanttofind:
for(i=0;
i<
n;
i++)
scanf("
words[i][1]);
//用户一次性输入要查找的关键字,words[i][0]用于存放字符串的长度
find(name,words[i]);
//对于每一个关键字,调用查找函数进行查找统计
}
子函数设计:
//求next值
voidget_next(SStringT,intnext[])//求next值
intj=1,k=0;
next[1]=0;
while(j<
T[0])
if(k==0||T[k]==T[j])
{
++j;
++k;
if(T[j]!
=T[k])next[j]=k;
elsenext[j]=next[k];
}
elsek=next[k];
//KMP算法
intIndex(SStringS,SStringT,intpos)//KMP算法
inti=pos,j=1;
while(i<
=S[0]&
&
j<
=T[0])
if(j==0||S[i]==T[j]){++i;
++j;
else
j=next[j];
if(j>
T[0])return(i-T[0]);
return0;
//求串长
intlenth(SStringstr)//求串长
inti=1;
while(str[i])i++;
return(i-1);
//查找函数
voidfind(charname[],SStringkeys)//对于输入的每一个/要查找的关键字,从小说文件中逐行读取字符串查找
{
SStringtext;
//存放从小说文件读取的一行字符串
inti=1,j=0,k;
//i用于存放行号,j用于存放列号,k用于输出格式的控制
FILE*fp;
if(!
(fp=(fopen(name,"
r"
))))//打开小说文件
printf("
Openfileerror!
exit(0);
keys[0]=lenth(keys);
//求关键字的长度
get_next(keys,next);
//求模式串(关键字)每一个字符对应的next值
%s\n"
keys[1]);
//打印关键字
while(!
feof(fp))//如果还没到小说文件末尾
k=0;
fgets(&
text[1],MAXSTRLEN,fp);
//从小说文件中读取一行字符串,存入text串中
text[0]=lenth(text);
//求读入的串的长度
j=Index(text,keys,j+1);
//调用KMP算法,统计关键字在该行出现的位置,若匹配不成功则返回0
if(j!
=0)
{num++;
//次数加1
第%d次出现在第%d行第%d列\n"
num,i,j);
k++;
}//若匹配成功则打印次数、行号和列号
while(j!
=0)//若该行找到了关键字,则继续寻找看是否还能匹配成功
//调用KMP算法从刚找到的列号后一字符起匹配
=0)
{num++;
}//若匹配成功,则打印次数、行号、列号
i++;
//行号加1,在下一行中寻找
if(k)printf("
//输出格式控制
}
算法流程图:
成功
KMP串匹配示意图:
五.源程序
#include<
stdio.h>
stdlib.h>
#defineMAXSTRLEN255//最大串长
intnext[MAXSTRLEN];
//KMP算法中用到的next
voidfind(charname[],SStringkeys)//查找函数,该函数是整个程序的重要部分,对于输入的每一个
{//要查找的关键字,从小说文件中逐行读取字符串查找
inti=1,j=0,k,num=0;
j=Index(text,keys,j+1);
{num++;
}//若匹配成功则打印行号和列号
}//若匹配成功,则打印列号
}//对于每一个关键字,调用查找函数进行查找统计
六.测试情况
参考文献:
[1]谭浩强.C程序设计(第三版)[M].北京:
清华大学出版社.330-336.
[2]陈守孔,孟佳娜,武秀川.算法与数据结构[M].北京:
机械工业出版社.71-80