要求編程建立一個文本文件,每個單詞不包括空格及跨行,單詞由字符序列構成且區分大小寫,完成以下功能:統計給定單詞在文本文件中出現的總次數、檢索輸出某單詞在文本文件中首次出現的行號及位置。
出現的問題:當選定單詞是某一行最後一個單詞時,記錄行數的計數器會多記錄一次行數.
編程環境是codeblocks,編譯器是GUN-GCC,操作系統是win7-64
#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);
}