近期深受開源的精神影響,並為之深深感動,想了很久,今天把我代碼積累多年的一個“英漢字典”公布。
研一的時候因為無聊或者因為興趣,做了一個純C語言的英漢字典。核心算法是KMP快速查找算法,雖然有點長,但思想簡單(我崇尚簡單),基本思想為:當你輸入某個英文時,如果字典收錄了這個英文,會查出中文意思;如果沒有收錄,會提醒你輸入中文意思。
做的時間比較久了,現在運行起來不是原本的意思,有空我會慢慢改進。
若你有心可以在此基礎上改進,也可以告訴我哪裡可以改進。謝謝!
view plain
/**************************
快速模式匹配---KMP算法
**************************/
#include <stdio.h>
#define MAXSIZE 10000
typedef struct
{
char ch[MAXSIZE];
int length;
}Seqstr;
void Getnext(Seqstr p, int next[]);
void Kmp(Seqstr t, Seqstr p, int next[]);
void InputStr(Seqstr &str);
void OutputStr(Seqstr &str);
void FileToStr(FILE *fp, Seqstr &t);
int main(void)
{
int next[30];
FILE *fp;
Seqstr p, t;
p.length = 0;
t.length = 0;
InputStr(p);
OutputStr(p);
fp = fopen("word.txt", "r"); //InputStr(t);
if (fp != NULL)
{
FileToStr(fp, t);
fclose(fp);
OutputStr(t);
Getnext(p, next);
Kmp(t, p, next);
}
else
{
printf("can't open file!\n");
}
return 0;
}
void FileToStr(FILE *fp, Seqstr &str)
{
printf("input string from file...\n");
while (!feof(fp))
{
str.ch[str.length] = fgetc(fp);
str.length++;
}
str.ch[str.length] = '\0';
}
void InputStr(Seqstr &str)
{
char c;
printf("input a string:");
while((c = getchar()) != '\n')
{
str.ch[str.length] = c;
str.length++;
}
str.ch[str.length] = '\0';
}
void OutputStr(Seqstr &str)
{
int i = 0;
while(str.ch[i] != '\0')
{
printf("%c", str.ch[i]);
i++;
}
printf("\n");
}
void Kmp(Seqstr t, Seqstr p, int next[])
{
int i, j;
int appearTimes = 0;
int lines = 1;
i = 0;
j = 0;
while(i < t.length)
{
while (i < t.length && j < p.length)
{
if (j == -1 || t.ch[i] ==p.ch[j])
{
i++;
j++;
}
else
{
j = next[j];
}
if (t.ch[i] == '\n') //計算行數
{
lines++;
i++;
}
}//while
if(j == p.length) //首次出現的位置(return i-p.length)
{
appearTimes++;
printf("The %d times appear at line: %d\n", appearTimes, lines);
j = 0;
}
}//while
}
void Getnext(Seqstr p, int next[])
{
int i, j;
next[0] = -1;
i = 0;
j = -1;
while(i < p.length)
{
if(j == -1 || p.ch[i] == p.ch[j])
{
++i;
++j;
next[i] = j;
}
else
{
j = next[j];
}
}
for(i = 0; i < p.length; i++)
{
printf("next[%d] = %3d\n", i, next[i]);
}
printf("\n");
}
測試數據:
view plain
good好的
hi你好
摘自 鄧秀茂的博客