C语言电子词典的实现

来源:互联网 发布:端口不通怎么办 编辑:程序博客网 时间:2024/06/05 05:49

 

#include#includevoid main(){FILE *fp=NULL;char In[21],Dic[26];char temp;//int i=0;printf("输入单词\n");/*读取输入单词*/gets(In);fp=fopen("dictionary.txt","r");while(!feof(fp)){//i=0;/*读取字库里的单词方式1do{Dic[i]=temp;i++;temp=fgetc(fp);}while(temp!='\t');Dic[i]='\0';*///方式2fscanf(fp,"%s",Dic);if(strcmp(In,Dic)==0){temp=fgetc(fp);fgets(Dic,26,fp);//获取翻译结果break;}//文件位置指针换行//方式1://fgets(Dic,20,fp);//方式2:fscanf(fp,"%s",Dic);}if(!feof(fp))puts(Dic);elseprintf("字典里没有这个单词!");fclose(fp);}
"internationalization"是所查字典中最长的单词,20个字符,出于节省空间考虑,设In[21],最后一位是留给字符串结束标志'\0'。由于所查dictionary.txt文件中,中文部分最长有24个字符,故稍微多预留一点空间,取26;若取23,Dic[ ]数组就不能全部容纳部分单词的中文翻译部分的字符(比如26),在使用fgets()函数进行换行的时候,就会产生溢出(严重问题),由于VC6下不对这种数组溢出进行检查报错,编译可以通过,但是运行可能会出错。在本程序中,当某个单词的中文翻译部分所占字节数大于25时,其后的单词均查不出,因为下面这条语句会修改In数组的值:
fgets(Dic,26,fp);
本人在运行的时候就碰到这种情况:
经Debug设置断点进行调试后发现,系统是先给字符数组In[ ]分配存储空间,为:0x0018FF0C,接着才给Dic[ ]分配存储空间,为:0x0018FF24。从两者的地址可以看出,地址只相差24字节,这就限制了数组Dic[ ]的上限值。当发生溢出时,虽然程序中没有对In[ ]数组进行操作,但是,其值已经被修改,所以运行出错。


需要注意的是,本程序未进行相应的错误处理,溢出问题可能导致程序崩溃。

(注:txt文件来源于、电子词典的描述来源于:http://blog.csdn.net/sxhelijian/article/details/45438617)
原创粉丝点击