【字符】压缩文本文件

背景:

压缩是一种有效的减小数据量的方法,目前已经被广泛应用于各种类型的信息系统之中。

一种压缩文本文件(假设文件中不包含数字)的方法如下:

1. 原始文本文件中的非字母的字符,直接拷贝到压缩文件中;

2. 原始文件中的词(全部由字母组成),如果是第一次出现,则将该词加入到一个词的列表中,并拷贝到压缩文件中;否则该词不拷贝到压缩文件中,而是将该词在词的列表中的位置拷贝到压缩文件中。

3. 词的列表的起始位置为 1 。 词的定义为文本中由大小写字母组成的最大序列。大写字母和小写字母认为是不同的字母,即 abc 和 Abc 是不同的词。词的例子如下: x-ray 包括两个词 x 和 ray;mary's 包括两个词 mary 和 s;a c-Dec 包括三个词 a 和 c 和 Dec 编写一个程序,输入为一组字符串,输出为压缩后的文本。

输入:

输入为一段文本,可以假设输入中不会出现数字、每行的长度不会超过 80 个字符,并且输入文本的大小不会超过 10M。

输出:

压缩后的文本。

把一个单词加符号看作一组

#include <stdio.h>
#include <string.h>
int f(char x)
{
	if(64<x&&x<91||96<x&&x<123) return 1;
	else return 0;
}
main()
{
	char li[1000][30],initial[100],wo[30],punctuation[20];
	char *p=wo,*q=punctuation,*s;
	int j,count=0,flag;
	while(gets(initial)!=NULL)
	{
		s=initial;
		while(*s)
		{
			if(f(*s)) { *p++=*s;*p='\0';}
			else { *q++=*s;*p='\0';}
		    if(!f(*s++)&&f(*s)||!*s)  //取单词加字符组合的结尾  
    		{
			    *q='\0';flag=1;			
	    		for(j=0;j<count&&flag;j++)
    	    	if(strcmp(li[j],wo)==0) 
	    	    { flag=0;printf("%d",j+1);}
    		    if(flag&&strlen(wo))
				{ strcpy(li[count],wo);count++;printf("%s",wo);}
	    	    printf("%s",punctuation);
	    	    p=wo;q=punctuation;
		    }
		}
		printf("\n");
	}
}

1、单词加其他字符组合的结尾可能为'\0',f('\0')=0,最后一个组合不输出  (测试用例 1)

2、组合里单词在前、符号在后,所以在先输入符号、后输入单词时,构成两个组合,

第一个组合读入的单词为空,此时若把单词复制到词的列表,输出的单词所在位置会出错;     (测试用例 3)

第二个组合读入的符号为空,此时的单词必须有结束标记'\0'   (测试用例 2)

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值