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

功能说明

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

运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值