要求编程建立一个文本文件,每个单词不包括空格及跨行,单词由字符序列构成且区分大小写,完成以下功能:统计给定单词在文本文件中出现的总次数、检索输出某单词在文本文件中首次出现的行号及位置。
出现的问题:当选定单词是某一行最后一个单词时,记录行数的计数器会多记录一次行数.
编程环境是codeblocks,编译器是GUN-GCC,操作系统是win7-64
编写者:兰州大学2013级计算机系hsy
#include<stdio.h>
#include <stdlib.h>
char* Newfile();
int Index();char* Newfile()//建立一个新的文本文档,并将输入内容写入文本中
{
FILE *fp;
char ch,filename[10];
printf("请输入文件名:(包括拓展名)\n");
scanf("%s",filename);
fp=fopen(filename,"w+");
ch=getchar();
printf("请输入单词:(请以$符号结束)\n");
while(ch!='$')
{
ch=getchar();
fputc(ch,fp);
}
fclose(fp);
return filename;
}int Index(char* p)//朴素模式匹配算法
{
FILE *fp;
if((fp=fopen(p,"r"))==NULL)
{printf("找不到文件\n");
exit(0);
}
//将文件读取到一维数组当中
char S[100],T[20];
char ch1,ch2;ch1=fgetc(fp);
int i=0;//i用于记录主串的长度while(ch1!='$')
{
S[i]=ch1;
ch1=fgetc(fp);
i++;
}
S[i]='$';//建立子串
printf("请输入你选择的单词:\n");
ch2=getchar();
ch2=getchar();
int j=0;//j用于记录输入的子串的长度
while(ch2!='\n')
{
T[j]=ch2;
ch2=getchar();j++;
}
//朴素模式匹配算法实现
int row,col;//row为列,col为行
row=1;
col=1;
int m,n,q;//m为S的下标,n为T的下标,q用于换行时记录m的值
m=0;
n=0;
q=1;
int num=0;//num用于记录选定单词出现的次数
while(m< jbr> {if(S[m]==T[n])
{
m++;
n++;
}
else
{
m=m-n+1;
n=0;};
if(n==j)
{
num++;
if(col==1)
{
row=m-n+1;
printf("第%d个单词出现的位置是第%d行第%d个\n",num,col,row);
}
else
{
row=m-n-q;
printf("第%d个单词出现的位置是第%d行第%d个\n",num,col,row);
}
}
if(S[m]=='\n')
{
col++;
q=m;
};
if(S[m]=='$')
{
printf("所选单词出现的次数是%d\n",num);
}
}
}int main()
{
char *p;//p用于记录和传递传递用户输入的文件名
p=Newfile();
Index(p);}
欢迎分享本文,转载请保留出处!