请考虑以下代码:
FILE *input;
FILE *output;
input=fopen("in.txt", "r");
output=fopen("out.txt", "w");
char buffer[1000];
char bytebuffer=0;
char tempchr=0;
char huffmancode[100]={0};
int bufferindex=7;
fgets(&buffer[0],255,input);
int length=0;
while (buffer[length]!=0) length++;
fputc(length,output);
int j;
int k;
for (j=0;j<length;j++){
tempchr=buffer[j];
strcpy(&huffmancode[0],code[tempchr-97]);
k=0;
while(huffmancode[k]!=0){
if (huffmancode[k]!='0'){
setBit(&bytebuffer,bufferindex);
}
bufferindex-=1;
if (bufferindex==-1){
fputc(bytebuffer,output);
bytebuffer=0;
bufferindex=7;
}
k++;
}
}
由于以下行,此代码无法正常运行:
tempchr=buffer[j];
此行对j < 10
完全正常,但对于j >= 10
,程序会抛出状态访问溢出异常。缓冲区变量分配为1000个字节,因此不清楚程序无法访问边界中的索引。为什么这会失败?
我没有包含一些数组定义。我不认为他们是问题,但他们反正在这里:
agac
数组:
int agac[1000]={21,12,9,7,5,
5,4,0,0,0,
0,3,2,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0
};
sembol
数组:
char sembol[1000]={0,0,0,'a','b',
0,'f',0,0,0,
0,'u','k',0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0
};
霍夫曼代码数组:
char *code[27]={ "00","01",0,0,0,
"11",0,0,0,0,
"101",0,0,0,0,
0,0,0,0,"100",
0,0,0,0,0,
0,0
};
答案 0 :(得分:2)
您评论说文件中的所有字符都只是小写字母,所以它们的代码是&gt; = 97.但是文件末尾可能有一个新行(即使您有一些编辑也会这样做没有新线路,导致了这个错误。
请注意,与gets不同,fgets包含缓冲区中的换行符(请参阅fgets)。
答案 1 :(得分:0)
添加此代码然后运行它:
tempchr=buffer[j];
if(tmpchr < 97 || (tmpchr-97 > 26))
{
printf("bug found");
}
strcpy(&huffmancode[0],code[tempchr-97]);
答案 2 :(得分:0)
这是一个问题:
fputc(length,output);
这只会将length
的最低(最低有效)字节(即int
)写入输出文件。它将以二进制形式编写,对于使用.txt
扩展名打开的文件来说,这似乎很奇怪。
你可能想要:
fprintf(output, "%d\n", length);