压缩文本文件

 

8. 压缩文本文件

成绩: 10 / 折扣: 0.8

背景

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

  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 main()
{  int j,k=0,m,t=0,flag=1;
   char s[84],a[83],word[10000][82];

   while( gets(a)!=NULL )
     { if(a[0]=='\0')
	{ printf("\n");
	  continue;
	}
       for(j=0;a[j]!='\0';j++)
	 s[j+1]=a[j];
       s[j+1]='\0';
       s[0]=' ';
       j=1;t=0;
       while(s[j]!='\0')
       {  if( ((s[j]>='a'&&s[j]<='z')||(s[j]>='A'&&s[j]<='Z')) && !((s[j-1]>='a'&&s[j-1]<='z')||(s[j-1]>='A'&&s[j-1]<='Z')) )
               k++;
          if( (s[j]>='a'&&s[j]<='z')||(s[j]>='A'&&s[j]<='Z') )
             {  word[k][t++]=s[j];
               if( !((s[j+1]>='a'&&s[j+1]<='z')||(s[j+1]>='A'&&s[j+1]<='Z')) )
                {  word[k][t]='\0';
		   flag=1;
                   for(m=0;m<k;m++)
                     {  if( !strcmp(word[k],word[m]) )
			   {  printf("%d",m);
			      k--;
			      flag=0;
                              break;
                           }
                     }
		   if(flag)  printf("%s",word[k]);
                 }
             }
          else
            {  printf("%c",s[j]);
               t=0;
            }
           j++;
        }
        printf("\n");
     }
     return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值