?? operator.cpp
字號:
/*
*FileName: Operator.cpp
*Author: vk
*Create Date: 2005-11-16
*Modify by: vk
*Last Modify: 2005-11-17s
*/
#include "stdafx.h"
#include "Win32Cut.h"
char wtable[maxn][maxl]; //詞表,儲存中文詞匯
char buff[BUFSIZE]; //輸入緩沖區
char result[RESSIZE]; //分詞結果
int btp; //緩沖區中當前已識別指針
int bp; //緩沖區中當前開始識別指針
int bl; //緩沖區有效長度
int wtsize; //詞匯表大小
int isinit = 0; //詞典是否初始化
FILE *fin,*fout; //文件分詞時的輸入輸出文件
/*===========================================
函數:compare
功能:返回2個單元的比較結果,供qsort調用
=============================================*/
int compare(const void* a,const void* b){
return strcmp((char*)a,(char*)b);
}
/*============================================
函數:init_table
參數:lexfilename 詞典文件路徑
功能:讀取字典并排序,初始化詞表
返回:成功ture,失敗false
=============================================*/
bool init_table(char* lexfilename){
FILE* fwt;
char line[100];
int i;
if(!(fwt = fopen(lexfilename,"r")))
return false;
for(i=0;;i++){
if(fscanf(fwt,"%s",line) ==EOF)
break;
strcpy(wtable[i],line);
}
wtsize = i-1;
//對詞表按字符串比較結果排序
qsort(wtable,wtsize,maxl*sizeof(char),compare);
fclose(fwt);
isinit = 1;
return true;
}
/*==============================================
函數:judge
參數:str 字符串
功能:對于給定字符串str,用二分法查找詞表,判斷該字符串是否是一個詞
返回:找到返回在詞表中的數組下標,否則返回-1
================================================*/
int judge(char *str){
int low,mid,high;
low = 0;
high = wtsize;
while(low <= high){
mid = (low+high)/2;
if(strcmp(str,wtable[mid]) ==0)
return mid;
else if(strcmp(str,wtable[mid]) >0)
low = mid+1;
else
high = mid-1;
}
return -1;
}
/*================================================
函數:cut
功能:從緩沖區buff中取定長(maxl)串,用正向最大匹配算法找出這段字符串中
從串首開始的最長詞,并從存到結果中
返回:匹配成功1,否則0
==================================================*/
int cut(){
char in[maxl];
char temp[maxl];
int i,k;
k = bp;
//從緩沖區里面讀取定長字串
for(i=0;i<(maxl-1)&&buff[k]!=0;i++,k++){
in[i] = buff[k];
}
//逐漸縮短字長進行匹配
for(;i>0;i--){
in[i] = 0;
if(judge(in) != -1){//如果匹配成功
//不過當前緩沖區指針與已匹配指針不一致,說明跳過了一段不能識別的字串,把這段字串加到結果中去
if(btp != bp){
for(k=btp;k<bp;k++){
sprintf(temp,"%c",buff[k]);
strcat(result,temp);
}
strcat(result,"/");
}
//把匹配成功的字串加到結果中去
strcat(result,in);
strcat(result,"/");
//設置當前緩沖區指針和已匹配指針
bp += i;
btp = bp;
return 1;
}
}
return 0;
}
/*=================================================
函數:analyse
功能:屏幕分詞函數,循環調用cut函數,對緩沖區(即屏幕上的字串)進行切詞,
如果切詞失敗,則試圖跳過一個或兩個字節再次匹配,直到匹配成功或者
到達緩沖區末尾。如果匹配成功則繼續調用cut;如果到達緩沖區末尾則輸
出到結果result數組,并返回
===================================================*/
void analyse(){
btp = bp = 0;
bl = strlen(buff);
result[0] = 0;
while(1){
if(!cut()){//如果切詞失敗,則有可能是緩沖區末尾或者不能識別單詞
while(bp<bl){
if(buff[bp]<0)//是漢字
bp ++;
bp++;
//跳過一個(漢)字進行再進行匹配,成功則跳出
if(cut()==1)
break;
}
if(bp >= bl){//如果緩沖區末尾,退出函數
//加上不能識別的字串
if(btp!=bl)
strcat(result,&buff[btp]);
return;
}
}
}
return;
}
//!!!!!!!以下函數為文件分詞使用
/*====================================================
函數:fillbuff
功能:當緩沖區不足時,將緩沖區剩余字串挪到頭部,并從輸入
文件中填充緩沖區致緩沖區滿或文件末尾
返回:如果達到文件末尾1,否則0
======================================================*/
int fillbuff(){
char ch;
int i;
for(i=0;bp<bl;i++,bp++)
buff[i] = buff[bp];
bp = 0;
bl = i;
while(bl<BUFSIZE){
if(fscanf(fin,"%c",&ch)==EOF){
buff[bl] = 0;
return 1;
}
buff[bl++] = ch;
}
buff[bl] = 0;
return 0;
}
/*=======================================================
函數:analysefile()
功能:對文件中的數據進行分詞并保存的結果文件中去。
=========================================================*/
void analysefile(){
int iseof = 0; //判斷是否文件末尾
iseof = fillbuff(); //填充緩沖區
btp = bp = 0;
bl = strlen(buff);
result[0] = 0;
while(1){
if(!cut()){//如果切詞失敗,則有可能是緩沖區末尾或者不能識別單詞
while(bp<bl){
if(buff[bp]<0)//是漢字
bp ++;
bp++;
//跳過一個(漢)字進行再進行匹配,成功則跳出
if(cut()==1)
break;
}
if(bp >= bl){//如果到達緩沖區末尾
//輸出結果
fprintf(fout,"%s",result);
if(iseof){//如果已經到達文件末尾
//輸出剩余的未能識別的字串
fprintf(fout,"%s",&buff[btp]);
return;
}
result[0] = 0;
bp = btp; //重新設置回bp
iseof = fillbuff(); //填充緩沖區
}
}
}
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -