C语言文本处理——郑码与拼音兼容的输入法实现

    xiaoxiao2025-04-13  33

    功能说明

    文本构成的格式是 郑码以及拼音的编码+空格+对应的汉字 如: 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

    运行结果如下:

    最新回复(0)