是的,有Knocker所说的问题,因为非中文字符还是一个字节的,所以当遇到一个字节的字符,会将其和后面的一字节连着读出来,打乱了字符的分隔.我还是贴出代码:
#include<stdio.h>
#include<string.h>
#include<conio.h>
FILE *in;
int ai;
struct rel{
int i;
char chi[20];
struct rel *next;
};
struct rel root={0,"ssss",NULL};
void change();
int look(char *);
main(){
ai=1;
change();
}
void change(){
char str[1]={0},pre[20]={0};
int a,b=0;
struct rel *p;
in=fopen("source.c","r");
while(!feof(in)){
fgets(str,2,in);
if(str[0]!=32&&str[0]!=58&&str[0]!=13&&str[0]!=10){
pre[b]=str[0];pre[b+1]=str[1];b++;}
else{
if(look(pre)==1){
p=(struct rel *)malloc(sizeof(struct rel));
p->next=root.next;root.next=p;p->i=ai;strcpy(p->chi,pre);ai++;}
for(b=0;b<20;b++) pre[b]=0; b=0;
}
}
printf("%s",root.next->next->chi);
}
int look(char *c){
struct rel *pp;
int i=1;
pp=&root;
while(pp->next!=NULL){
pp=pp->next;
if(!strcmp(pp->chi,c)) {i=0;break;}
else i=1;}
if(i==1) return 1;
if(i==0) return 0;
}
source.c中内容如下:
信息检索:索引 分词
信息组织:元数据 索引
以上程序的目的是从source.c文件中读取中文词,以空格和冒号作分词标志.如果用fgets(str,1,in),然后看str[0]是否大于0X80,以判断读得的字符是否是中文,如是,就再读后面一个字节,组成一个中文字符.但是我试的时侯,却出现了死循环.其代码如下:
while(!feof(in)){
fgets(str,1,in);
if(str[0]>0X80){
pre[b]=str[0];fgets(str,1,in);pre[b+1]=str[0];b++;}
else{
if(look(pre)==1){
p=(struct rel *)malloc(sizeof(struct rel));
p->next=root.next;root.next=p;p->i=ai;strcpy(p->chi,pre);ai++;}
for(b=0;b<20;b++) pre[b]=0; b=0;
}
}
后面发现上面死循环的代码根本就没进入到IF(if(str[0]>0X80))为真时的分支.下面这样也会死循环:
while(!feof(in)){
fgets(str,1,in);}
但是如将其改为
while(!feof(in)){
fgets(str,2,in);}就不会死循环了.请问为何?
另外fgets()函数是不是有个指针,会指向当前读取的字符呢,如果可直接对这个指针进行操作的话,也可以解决这个问题.
(感谢Knocker和feng1256,但我是新来的,在精华贴里似乎找不到有关汉字处理的帖,请各位指教,谢谢了)
[此贴子已经被作者于2006-5-11 11:33:10编辑过]