void locating(char name[],char keys[]) { int i=1; //i为行号 int j=0; //j为列号(该行第几个单词) int k; //每一行出现的次数 char text; //存放进行比对的一行的字符串 int count=0; //出现总次数 //打开目标文件 FILE *fp; fp=fopen(name,"r"); if(fp==NULL) { printf("File Opening Failure"); exit(0); } keys[0]=length(keys); get_next(keys,next); printf("%s\n",&keys[1]); //打印关键字 while(!feof(fp)) { k=0; fgets(&text[1],MaxSize,fp); text[0]=length(text); j=KMP_match(text,keys,j+1); if(j!=0) { printf("row=%d,column=%d",i,j); k++; } while(j!=0) { j=KMP_match(text,keys,j+1); //调用KMP算法从刚找到的列号后一字符起匹配 if (j!=0) { printf(",%d",j); //若匹配成功,则打印列号 k++; } } printf("\n"); i++; count=count+k; } fclose(fp); if(count) { printf("%s共出现%d次\n",&keys[1],count); } else { printf("Not Found the Keyword(s)\n"); } }加入限制条件只有单词之后是空格才输出
时间: 2024-01-28 17:05:46 浏览: 60
unb-pp-01-2015-master.zip_//2015PP.com_2015_pp.com_The Image_use
你想要加入限制条件,只有单词之后是空格才输出,可以在KMP_match函数中加入判断条件。假设当前匹配到了文本串text的第j个位置,那么只有当text[j+keys[k]]是空格时,才说明关键字keys[k]匹配到了一个完整的单词,此时才输出列号。具体代码如下:
```
int KMP_match(char text[],char keys[],int start)
{
int i=start,j=1;
while(i<=text[0]&&j<=keys[0])
{
if(j==0||text[i]==keys[j]) //匹配成功,继续匹配下一个字符
{
i++;
j++;
}
else //匹配失败,回溯到前面位置重新开始匹配
{
j=next[j];
}
if(j>keys[0]) //匹配成功,返回列号
{
if(text[i+1]==' '||text[i+1]=='\n') //判断是否为完整单词
return i-keys[0]+1;
else
j=1;
}
}
return 0; //匹配失败,返回0
}
```
在locating函数中,将输出列号的部分修改为:
```
if(j!=0)
{
if(text[j+keys[0]]==' '||text[j+keys[0]]=='\n') //判断是否为完整单词
{
printf("row=%d,column=%d",i,j);
k++;
}
}
```
阅读全文