功能说明
文本构成的格式是 郑码以及拼音的编码+空格+对应的汉字
如: aaam 万无一失
编写c程序,使之能在命令窗中运行,用tcc编译为trans.exe。实现功能:命令行参数输入的是郑码或者拼音的编码,读取文本文件,查找到编码后输出对应的汉字。
如:键入trans.exe aaam 回车 输出 “万无一失”
需要计算程序查询一个编码所需的时间,并进行输出。在程序设计的时候,需要提高程序运行效率,尽量减短字符串查询所需要的时间。
程序设计分析
要完成编码的查找和对应汉字的输出,我们可以对文本文件进行读取后,将编码和汉字存入两个不同的数组中并一一对应(编码存入p[i].key中, 汉字存入p[i].chinese中)。
进行查找时只需要将命令参数的字符串(命令参数字符串存入keywords中)与存编码的数组(也就是p[i].key)进行比较,两个字符串相同的时候,输出编码对应的汉字(输出p[i].chinese的内容)既可。
计算程序执行所需的时间,使用 clock() 函数(该函数需要用到 #include <time.h> 这个头文件)。在读取文件前记录一个时间值,在输出汉字的时候再记录一个时间,最后计算两个时间的差值,即为查询一个编码的时间。
在程序的实现中,使用指针以及动态内存分配的方式进行字符串的存储,最后将内存进行释放,这样有助于提高程序的运行效率。
程序代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX 111111 //最大记录数
//定义结构体,命名为trans
struct trans
{
char *key; //词条(搜索的内容)
char *chinese; //词条对应的翻译
};
//打开文件读取内容存入对应数组,获得文本数量值赋值给a
int openfile(struct trans **p)
{
FILE *fp;
char buf[100] = { 0 };
int i=0,j,len;
struct trans *p1;//pD指向数组p的首地址
fp=fopen("C://Users//Administrator//Desktop//incode.txt","r"); //打开文件,写入模式
if(fp==NULL) //若fopen()函数返回NULL则打开文件失败
{
printf("文件打开失败\n");
exit(0); //退出
}
*p = (struct trans *)malloc(sizeof(struct trans) * MAX);//固定分配MAX大小内存
memset(*p, 0, sizeof(struct trans) * MAX);//将分配内存初始化为0
p1=*p;
while (!feof(fp))//循环读取文件,直到文件末尾
{
memset(buf, 0, sizeof(buf));
fscanf(fp,"%s",buf); //读取到空格结束
len = strlen(buf);//得到读取到字符串长度
if (len > 0)
{
p1[i].key = (char *)malloc(len);//根据字符串长度分配内存
memset(p1[i].key, 0, len);
strcpy(p1[i].key, &buf[0]);//将读取到的内容拷贝到key中
}
memset(buf, 0, sizeof(buf));
fgets(buf, sizeof(buf), fp); //读取到转行符结束
len = strlen(buf);
if (len > 0)
{
p1[i].chinese = (char *)malloc(len);
memset(p1[i].chinese, 0, len);
strcpy(p1[i].chinese, &buf[0]);
}
i++;//计数器加1
}
fclose(fp);//关闭字典文件
return i;
}
int main(int argc, char *argv[])
//int main()
{
long time_start= 0;//记录函数执行的开始时间
long time_end = 0;//记录函数执行的结束时间
struct trans *p = NULL;
int i=0,j,a;
char* keywords = argv[1];
//char *keywords="abrn";
time_start = clock(); //记录开始时间,单位ms
i=openfile(&p); //读取文本进行存储
//进行比较和查找
for(j = 0;j < i;j++)
{
if(strcmp(keywords,p[j].key)==0)
{
a=1;
break;
}
a=-1;
}
if(a==-1)
printf("未查找到内容\n"); //比较完所有内容,还是未找到查找的内容
else
printf("%s",p[j].chinese); //找到需要查找的内容,输出结果
free(p);//释放p内存
time_end=clock(); //记录结束时间
printf("time is:%d\n",time_end-time_start); //输出时间
return 0;
}
使用tcc进行编译运行
为了使 C语言源代码与TXT文本文件进行匹配,首先设置 .txt 文件和 .c 文件的编码格式为ANSI。设置方式是:将incode文件进行另存为,另存为时选择编码格式为ANSI;新建一个文本文件,将C语言源代码放到文本文件中,同样进行另存为,另存为时存为 trans.c 编码格式为ANSI。
打开 trans.c 所在的目录,使用 tcc将 trans.c 文件编译生成 trans.exe,实现代码为:
tcc trans.c //编译产生trans.exe
主函数带参数的程序的运行
trans.exe string //string表示输入的参数字符串,输入需要查询的编码
或者直接运行
tcc -run trana.c string
运行结果如下: