考虑以下代码:
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,程序抛出了一个状态访问溢出异常。buffer变量被分配给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
}; 发布于 2012-04-16 19:02:49
您已经注释过,文件中的所有字符都是小写字母,因此它们的代码是>= 97。但也有可能在文件的末尾有一个新的行(一些编辑器会将其放入,即使您没有新的行),这是导致错误的原因。
请注意,与gets不同,fget在缓冲区中包含换行符(请参阅fgets)。
发布于 2012-04-16 18:54:41
添加以下代码,然后运行它:
tempchr=buffer[j];
if(tmpchr < 97 || (tmpchr-97 > 26))
{
printf("bug found");
}
strcpy(&huffmancode[0],code[tempchr-97]);发布于 2012-04-16 19:02:10
这里有一个问题:
fputc(length,output);这将仅将length (即int)的最低(最低有效)字节写入输出文件。它将以二进制形式编写它,对于一个使用.txt扩展名打开的文件来说,这似乎非常奇怪。
您可能需要:
fprintf(output, "%d\n", length);https://stackoverflow.com/questions/10172425
复制相似问题