📄 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 + -