50. 【字符】压缩文本文件

背景:

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

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

    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 word=0,i=0,j=0,k=0,flag=1,m=0;  
        char s[500],words[10000][100],a[500];  
        for(i=0;i<10000;i++)  
           for(j=0;j<100;j++)  
              words[i][j]='\0';  
        while(gets(a) != NULL){//得到一行  
            if('\0'==a[0]){printf("\n");continue;}//只有一个换行符,那就换行  
            //有意义的一行,初始化  
            for(i=0;a[i]!='\0';i++)s[i+1]=a[i];
            s[0]='.';s[i+1]='\0';k=0; i=1; 
            while(s[i]!='\0'){//依次处理每个字符  
               if((s[i]>='a' && s[i]<='z')||(s[i]>='A' && s[i]<='Z')){  
                   //这是一个字母  
                   if(!((s[i-1]>='a' && s[i-1]<='z')||(s[i-1]>='A' && s[i-1]<='Z'))){
					   word++;k=0;words[word][k++]=s[i];}//这是一个单词的开头   
                   else{words[word][k++]=s[i]; }//把这个字母放好了,干点儿别的
				   if(!((s[i+1]>='a' && s[i+1]<='z')||(s[i+1]>='A' && s[i+1]<='Z'))){ //单词结束就审判 
                       words[word][k]='\0';  
                       flag=1;  
                       for(j=1;j<word;j++){  
                           if(!strcmp(words[j],words[word])){  
                               printf("%d",j);  
                               for(m=0;m<100;m++){words[word][m]='\0';} 
                               word--;   
                               flag=0;  
                               break;  
                            }  
                        }  
                        if(flag){printf("%s",words[word]);}}   
               }else{  
                   putchar(s[i]);  
               }i++;  }
            printf("\n"); 
            }    
        return 0;  
    }  

  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值