背景:
一种压缩文本文件(假设文件中不包含数字)的方法如下:
1. 原始文本文件中的非字母的字符,直接拷贝到压缩文件中;
2. 原始文件中的词(全部由字母组成),如果是第一次出现,则将该词加入到一个词的列表中,并拷贝到压缩文件中;否则该词不拷贝到压缩文件中,而是将该词在词的列表中的位置拷贝到压缩文件中。
3. 词的列表的起始位置为 1 。 词的定义为文本中由大小写字母组成的最大序列。大写字母和小写字母认为是不同的字母
输入:
输入为一段文本,可以假设输入中不会出现数字、每行的长度不会超过 80 个字符,并且输入文本的大小不会超过 10M。
输出:
压缩后的文本
测试用例 1 以文本方式显示
1.Please, please do it--it would please Mary very,↵
2.very much.↵
3.↵
4.Thanks↵
以文本方式显示
1.Please, please do it--4 would 2 Mary very,↵
2.7 much.↵
3.↵
4.Thanks↵
#include<stdio.h>
#include<string.h>
int main()
{
char s[10000][81]={0};
int k=0,l=1,r=1;
for(;;r++)
{k=1;
char a[90]={0};
char b[90][100]={0},c[100]={0};
int i=1;
scanf("%c",&a[0]);
if(a[0]==0)
break;
do
scanf("%c",&a[i]);
while(a[i++]!='\n'); //输入
int j=0;
int n=0;
if(a[0]!=0)
{
for(j=0;a[j]!=0;j++)
{
if((a[j]>='a'&&a[j]<='z')||(a[j]>='A'&&a[j]<='Z'))
{b[k][n]=a[j];
n++;} //将词存入b[]中;
else {
c[k]=a[j];//将其他字符存入c[]中
b[k][n]=0;
k++;//换行
n=0;}}} //将n清零以便下一次纪录
char d[90]={0};
for(n=1;n<k;n++)
{j=1;
for(;j<l;j++)
if(strcmp(s[j],b[n])==0)//比较s与b
{sprintf(d,"%d",j);
strcpy(b[n],d);//把bn变为相应的次数
break;}
if(j==l&&b[n][0]!=0)//将b中单词存入s以便进行上一个循环
{
strcpy(s[l],b[n]);
l++;}
printf("%s",b[n]);
printf("%c",c[n]);
}
}
return 0;
}