📄 stdafx.cpp
字号:
/*-----------------------------中文分词程序------------------------------
------------------------计算机系06级 062547 陈瑶----------------------*/
// stdafx.cpp : source file that includes just the standard includes
// wordppl.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
#include <stdio.h>
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
extern char tt[][40];
char * source,* result; //文件暂存数组
int sum; //字典长度
FILE *fp1,*fp2; //定义两个文件指针
long filelen; //输入文件的长度
char scrbuf[MD]; //屏幕文件缓冲区
char scrres[SD]; //屏幕文件结果区
/*------------------------------------分词实现部分-----------------------------------------*/
//比较函数
int compare(const void* a,const void* b){
return strcmp((char*)a,(char*)b);
}
//折半查找算法
int binsearch(int Len,char *aidkey)
{ int low,high,mid;
low=0;high=Len-1;
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(aidkey,tt[mid])==0)
return mid; //查找成功
else if(strcmp(tt[mid],aidkey)>0)
high=mid-1; //修改查找区间上界
else
low=mid+1; //修改查找区间下界
}
return -1; //查找失败
}
//初始化函数
int initialize()
{
sum=53335;
qsort(tt,sum,40*sizeof(char),compare); //对字典进行排序
return 1;
}
//采用逆向最大匹配算法
void scrnegcutword()
{
int i,j,k; //普通变量
// int end; //为1标示已经扫描完待分析文件,反之为0
int mask=0; //遇到不能识别字符则标记为1,否则为0
int bp,sb,rp; //bp为字符串已识别指针,sb为临时用指针,sp为结果数组指针
char buffer[37];
filelen=strlen(scrbuf);
for(i=0;i<2*filelen;i++)
{ scrres[i]=1; }
//分词主程序部分,采用正向最大匹配算法
bp=filelen-1;rp=2*filelen-1; scrres[rp+1]=0;
while(1)
{
if(bp<=35)
{ for(j=0;j<=bp;j++)
buffer[j]=scrbuf[j];
buffer[bp+1]=0;
}
else
{ sb=bp;
for(j=0;j<36;j++)
{ buffer[j]=scrbuf[sb-35+j]; }
buffer[j]=0;
}
if(bp==-1)break;
k=strlen(buffer);
for(i=k-1;i>=0;i--)
{
k=strlen(buffer);
j=-1;
if( strcmp(buffer,"0")==0||strcmp(buffer,"1")==0||strcmp(buffer,"2")==0||strcmp(buffer,"3")==0||strcmp(buffer,"4")==0||
strcmp(buffer,"5")==0||strcmp(buffer,"6")==0||strcmp(buffer,"8")==0||strcmp(buffer,"7")==0||strcmp(buffer,"9")==0)
goto A;
j=binsearch(sum,buffer);
if(j!=-1) //如果查找到,则输出查找到的内容,并将bp指针往后移相应位置
{ if(mask==1) { mask=0; scrres[rp]='|'; rp--; }
//strcat(scrres,buffer); rp-=k;
//k=strlen(buffer);
for(j=k-1;j>=0;j--)
{ scrres[rp]=buffer[j];
rp--;
}
scrres[rp]='|'; rp--;
bp=bp-k;
break;
}
else //如果查不到
{
A: if(i==1) //若还剩2个字节,则判断第一个字节,若大于0,说明不是汉字,输出一个字节
{ buffer[2]=0; //若小于0,说明该汉字不在此库中,输出该字。并将bp指针往后移相应位置
if(buffer[1]<0)
{ scrres[rp]=buffer[1];rp--;scrres[rp]=buffer[0]; rp--; bp=bp-2; mask=1; break; }
else
{ scrres[rp]=buffer[1]; rp-=1; bp=bp-1; mask=1; break;
}
}
if(i==0) //若还剩1个字节,说明是不能识别字符,则直接输出这个字节,并将bp指针往后移1个字节
{ buffer[1]=0;
scrres[rp]=buffer[0]; rp-=1; bp=bp-1; mask=1; break;
}
k=strlen(buffer);
for(j=0;j<k;j++) { buffer[j]=buffer[j+1]; } //将buffer第一位去掉,再进行匹配
}
}//for(i=i-1;i>=0;i--)
}//while(1)
for(i=0;i<2*filelen;i++)
if(scrres[i]!=1)
break;
for(j=0;j<2*filelen-i;j++)
{ scrres[j]=scrres[i+j]; }
scrres[j]=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -