目录
关键字:
文件流的打开与关闭()
(fopen & fclose)
单词的大小写处理及程序退出
关键字的查找与输出
查找(Binary_search):
输出
完整代码:
字典文档:dictionary.txt
运行效果GIF:
编写过程遇到的一些问题 :
1、编译出现警告: the `gets' function is dangerous and should not be used.
解决办法:
2、程序运行出现中文乱码
解决办法:
FILE *fp;
fp = fopen("dictionary.txt", "r");//打开文件
if (fp == NULL)
{
printf("Please check the file situction."); //文件打开问题处理
exit(0);
}
else
{
while (!feof(fp))
{
fscanf(fp, "%s%s", e[w], c[w]); //把数据读入到数组里保存
w++;
}
fclose(fp);
}
while(1)
{
flag = 1;
printf("请输入你想查找的单词\n");
printf("\n");
// fgets(s,99,stdin);//输入要查找的单词
gets(s);
int x = 0, m = -1;
while(s[x] !='\0')
{
if(s[x]!= ' '&&m != -1)
{
s[m] = s[x];
m++;
}
else if(s[x] == ' '&& m == -1)//删除空格
{
m = x;
}
x++;
}
if(m != -1)
{
s[m] = '\0';
}
t = strlen(s);
for(i = 0;i < t;i++)
{
if(s[i]>='A'&&s[i]<='Z')//大写转小写
{
s[i] +=32;
flag = 0;
}
}
if(strcmp(s,"0000")==0)//退出判断
{
break;
}
else
[
i= Binary_search(s);//二分法查找目标单词
if(i==0)
{
printf("对不起,无法查询到您所需要的单词,请重新输入另一个单词:\n");
}
else
if(flag == 0)
{
printf("\n");
printf("这个单词的释意是'%s':%s",s,c[i]);
printf("\n");//输入大写转小写输出提示信息
}
else
{
printf("\n");
printf("'%s'is %s\n",s,c[i]);
printf("\n");
}
printf("\n");
}
int Binary_Seareh(char p[999])
{
int low = 0, mid, high = w - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (strcmp(e[mid], p) == 0) //利用strcmp函数对输入进来的单词与文件中单词比对
{
return mid;
}
if (strcmp(e[mid], p) > 0)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
return 0;
}
/*************************************************************************
> File Name: dictionary.c
> Author:
> Mail:
> Created Time: 2018年12月13日 星期四 17时02分32秒
************************************************************************/
#include
#include
#include
int w =0;
int Binary_search(char p[999]);
char e[9999][999],c[9999][999];//用两个数组分别从文件中读入英文和汉译
int Binary_search(char p[999])
{
int low=0,mid,high=w-1;
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(e[mid],p)==0) //利用strcmp函数对输入进来的单词与文件中单词比对
{
return mid;
}
if(strcmp(e[mid],p)>0)
{
high=mid-1;
}
else
{
low=mid+1;
}
}
return 0;
}
int main()
{
int i,n,m,j,k,t;
int flag;//标记大小写
char s[99],ss[99];
printf("###################################################\n");
printf("######### ###########\n");
printf("####### ########\n");
printf("##### 欢迎使用典典英汉词典 ######\n");
printf("####### ########\n");
printf("######### ###########\n");
printf("###################################################\n");
FILE *fp;
fp = fopen("dictionary.txt","r");//打开字典文件
if(fp == NULL)
{
perror("请检查一下文件状态");
exit(0);
}
else
{
while(!feof(fp))
{
fscanf(fp,"%s%s",e[w],c[w]);//把数据读入到数组里保存
w++;
}
fclose(fp);
}
printf("\n");
printf("如果你想退出请输入'0000'\n");
printf("\n");
while(1)
{
flag = 1;
printf("请输入你想查找的单词\n");
printf("\n");
// fgets(s,99,stdin);//输入要查找的单词
gets(s);
int x = 0, m = -1;
while(s[x] !='\0')
{
if(s[x]!= ' '&&m != -1)
{
s[m] = s[x];
m++;
}
else if(s[x] == ' '&& m == -1)//删除空格
{
m = x;
}
x++;
}
if(m != -1)
{
s[m] = '\0';
}
t = strlen(s);
for(i = 0;i < t;i++)
{
if(s[i]>='A'&&s[i]<='Z')//大写转小写
{
s[i] +=32;
flag = 0;
}
}
if(strcmp(s,"0000")==0)//退出判断
{
break;
}
else
{
i= Binary_search(s);//二分法查找目标单词
if(i==0)
{
printf("对不起,无法查询到您所需要的单词,请重新输入另一个单词:\n");
}
else
if(flag == 0)
{
printf("\n");
printf("这个单词的释意是'%s':%s",s,c[i]);
printf("\n");//输入大写转小写输出提示信息
}
else
{
printf("\n");
printf("'%s'is %s\n",s,c[i]);
printf("\n");
}
printf("\n");
}
}
printf("欢迎下次使用\n");;
}
gcc dictionary.c -o dictionary
(虽然能够运行,但是作为一名严谨的程序猿,还是用正规主流的用法)
如下:
dictionary.c: In function ‘main’:
dictionary.c:73:9: warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration]
gets(s);
^~~~
fgets
/tmp/ccfIc8bN.o:在函数‘main’中:
dictionary.c:(.text+0x218): 警告: the `gets' function is dangerous and should not be used.
问题出在程序中使用了 gets ,Linux 下gcc编译器不支持这个函数,解决办法是使用 fgets,用法如下。
char *fgets(char *s, int size, FILE *stream);//eg:可以用fgets(tempstr,10,stdin)//tempstr 为char[]变量,10为要输入的字符串长度,stdin为从标准终端输入。
在wendows下将文档另存为UTF-8编码