作者ayaerika (ffffffddd)
看板C_and_CPP
标题[问题] LZW压缩一问
时间Sat Apr 4 22:51:37 2009
我是第一次写程式,太难的语法完全不懂
用最笨的方法,写了LZW压缩
感觉逻辑都对为什麽印出那麽诡异的结果
请高手赐教
---------------------------------------
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
# define NUM 1000
//使用LZW压缩一段文章 输出s c output code string
int main() {
char diction[NUM][NUM],s[NUM],c;
int i,j,u;
FILE *p,*e; //p读取用,e写入
p=fopen("C:\\Documents and Settings\\dssdsd\\encode.txt","r");
e=fopen("C:\\Documents and Settings\\dssdsd\\encode.doc","w");
fprintf(e,"s\t\t\t\t\tc\toutput\tcode\tstring\n--------------------------------------\n");
//a到z
for(j=0;j<=25;j++)
diction[j][0]=j+97;
j++;
diction[j][0]=33;
j++;
diction[j][0]=39;
j++;
diction[j][0]=97;
//以上建立a~z
fscanf(p,"%c",&c);
s[0]=c;
while(fscanf(p,"%c",&c)!=EOF){
fprintf(e,"%s\t\t\t%c\n",s,c);
j=0;
while(strcmp(s ,diction[j] )!=0)//找出s在字典对应的code
j++;
u=j;//存入u
i=0;
while(s[i]!='\0')
i++;
s[i]=c;//s=s+c
j=0;
while(strcmp(s ,diction[j] )!=0){//搜寻s+c是否存在字典
j++;//
if(diction[j][0]=='\0')break;//搜寻不到对应的字串跳出回圈
}
if(strcmp(s ,diction[j] )==0){//存在字典
fprintf(e,"\n");
memset(s,'\0',sizeof(s));
s[0]=c;//s=c
}
else{//不存在字典
strcpy(diction[j],s);//加入字典
fprintf(e,"%d\t%d\t%s\n",u,j,s);//列印出output,code,string
}
}
fclose(p);
fclose(e);
system("pause");
return 0;
}
s c output code string
--------------------------------------
w
w e 22 26 we
we f 26 30 wef
wef f 30 31 weff
weff s 31 32 weffs
weffs a 32 33 weffsa
weffsa b 33 34 weffsab
weffsab b 34 35 weffsabb
weffsabb a 35 36 weffsabba
weffsabba b 36 37 weffsabbab
weffsabbab c 37 38 weffsabbabc
weffsabbabc a 38 39 weffsabbabca
weffsabbabca b 39 40 weffsabbabcab
weffsabbabcab b 40 41 weffsabbabcabb
weffsabbabcabb a 41 42 weffsabbabcabba
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.136.131.181
※ 编辑: ayaerika 来自: 220.136.131.181 (04/04 23:13)