程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 分享純C語言英漢字典源碼

分享純C語言英漢字典源碼

編輯:關於C

 

 近期深受開源的精神影響,並為之深深感動,想了很久,今天把我代碼積累多年的一個“英漢字典”公布。

研一的時候因為無聊或者因為興趣,做了一個純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你好

 

摘自 鄧秀茂的博客

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved