本程式只是一篇範例,用於搜尋文章中的關鍵字
並沒有使用到課本的失敗函數,如果想要加速搜尋請自行修改pmatch函數!
本程式是我教導別人一步一步慢慢寫出來的,可能會有許多問題(參數命名、...等)
但如果想學字串搜尋的人是個可以參考的程式!
當如果會這個程式之後,那麼我們就可以直接使用 strstr 來做字串搜尋!這樣會比較方便一點~ 不過一開始對於寫程式不熟的人來說,最好可以練習一下怎麼重頭自己寫!
程式碼預覽(因為這邊打註解會怪怪的,所以要看註解請下載檔案)
以下程式碼寫得很不好,有空我在修飾,而且沒有呼叫到fail!
/* @作者 atien 阿添
使用請注意
本程式只是一篇範例,用於搜尋文章中的關鍵字
並沒有使用到課本的失敗函數,如果想要加速搜尋請自行修改pmatch函數!
本程式是我教導別人一步一步慢慢寫出來的,可能會有許多問題(參數命名、...等)
但如果想學字串搜尋的人是個可以參考的程式!
s為要找的字 pat 為文章
i=0
↓
s = a b c d
pat= a b c d a b a b c d
↑
j=1
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <windows.h>
using namespace std;
#define max_string_size 100
#define max_pattern_size 10000
/*顏色定義*/
#define RED FOREGROUND_RED
#define GREEN FOREGROUND_GREEN
#define BLUE FOREGROUND_BLUE
#define setcolor(c) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c)
int failure[max_pattern_size];
char str[max_string_size];
char pat[max_pattern_size];
int sav[max_string_size];//存儲找到的位置
int num=0;//數找到幾個
/*失敗函數*/
void fail(char *pat)
{
int n = strlen(pat);
int i=0,j=0;
failure[0] = -1;
for(j=1; j<n; j++)
{
i=failure[j-1];
while((pat[j] != pat[i+1]) && (i >= 0))
i=failure[i];
if(pat[j] == pat[i+1])
failure[j] = i+1;
else failure[j] = -1;
}
}
/*字串比對*/
void pmatch(char *string,char *pat)
{
int i,j;
char *k;
int lens = strlen(string);
int lenp = strlen(pat);
for(j=0,i=0;j<lenp;j++)
{
if(string[i] == pat[j])
{//找到相同的字,還沒找完
i++;
}
else
i=0;//找錯字
if(i==strlen(string))
{//找到了!!
sav[num]=j;
num++;
}
}
}
int main()
{
FILE *fp = fopen("abc.txt","r");
char c;
int i=0;
while((c=getc(fp))!=EOF)
{
pat[i]=c;
i++;
}
printf("請輸入要找的字");
cin >> str;
printf("\n");
//fail(pat);// 本程式並沒有使用到此副程式,請自行修正!
/*字串比對*/
pmatch(str,pat);
/*印出標記色*/
int count=strlen(str);
for(int y=0,j=0;y<strlen(pat);y++)
{
if(y<=sav[j] && (y>=sav[j]-strlen(str)+1)){
setcolor(12);//找到關鍵字印的顏色
count--;//要印出整個長度的顏色
if(count==0)
{/*換找下一個*/
count=strlen(str);
j++;
}
}
else
setcolor(RED+GREEN+BLUE);//非關鍵字的顏色
cout << pat[y];
}
fclose (fp);
system("pause");
return 0;
}






沒有留言:
張貼留言
俗話說
凡走過必留下痕跡,凡住過必留下鄰居
凡爬過必留下樓梯,凡來過必留下IP
看過文章之後歡迎留下您寶貴的意見喔!