資源簡(jiǎn)介
在一個(gè)文件中查找某個(gè)關(guān)鍵詞,并把出現(xiàn)該關(guān)鍵詞的行及行號(hào)顯示出來(lái)。
使用C語(yǔ)言的字符串存儲(chǔ)結(jié)構(gòu)來(lái)實(shí)現(xiàn)字符串的操作,編寫(xiě)函數(shù)index實(shí)現(xiàn)在一個(gè)傳中查找子串的功能。然后從文件中每次讀入一行,作為一個(gè)主串看待,然后查找是否存在待查找的關(guān)鍵詞(子串),如果有則顯示該行內(nèi)容及行號(hào),否則繼續(xù)處理下一行。
代碼片段和文件信息
#include?
#include?
#define?MAXSTRLEN?255?????????//最大串長(zhǎng)
typedef?char?SString[MAXSTRLEN+1];???//串的定長(zhǎng)順序存儲(chǔ)表示
int?next[MAXSTRLEN];????????????//KMP算法中用到的next
void?get_next(SString?Tint?next[])???//求next值
{
int?j=1k=0;
next[1]=0;
????while(j {
???if(k==0||T[k]==T[j])?
???{
????++j;++k;?
????if(T[j]!=T[k])?next[j]=k;
????else?next[j]=next[k];
???}
???else?k=next[k];
}
}
int?Index(SString?SSString?Tint?pos)?//KMP算法
{
int?i=posj=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]);
???else
????return?0;
}
int?lenth(SString?str)????//求串長(zhǎng)
{
int?i=1;
while(str[i])?i++;
return(i-1);
}
void?find(char?name[]SString?keys)?//查找函數(shù),該函數(shù)是整個(gè)程序的重要部分,對(duì)于輸入的每一個(gè)
{????????????????????????????????????//要查找的關(guān)鍵字,從小說(shuō)文件中逐行讀取字符串查找
SString?text;?//存放從小說(shuō)文件讀取的一行字符串??????
int?i=1j=0knum=0;???//i用于存放行號(hào),j用于存放列號(hào)k用于輸出格式的控制
FILE?*fp;
if?(!(fp=(fopen(name“r“))))?//打開(kāi)小說(shuō)文件
{
???printf(“Open?file?error!\n“);
???exit(0);
評(píng)論
共有 條評(píng)論