0

考虑以下代码:

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
    };  
4

3 回答 3

2

您已评论文件中的所有字符都只是小写字母,因此它们的代码 >= 97。但文件末尾可能有一个新行(即使您没有,有些编辑器也会放一个新行),这导致了这个错误。

请注意,与 get 不同,fgets 在缓冲区中包含换行符(请参阅fgets)。

于 2012-04-16T11:02:49.050 回答
0

这是一个问题:

fputc(length,output);

这只会将length(它是一个int)的最低(最不重要)字节写入输出文件。它将以二进制形式写入,这对于使用.txt扩展名打开的文件来说似乎很奇怪。

你可能想要:

fprintf(output, "%d\n", length);
于 2012-04-16T11:02:09.627 回答
0

添加此代码然后运行它:

tempchr=buffer[j];
if(tmpchr < 97 || (tmpchr-97 > 26))
{
  printf("bug found");
}
strcpy(&huffmancode[0],code[tempchr-97]);
于 2012-04-16T10:54:40.907 回答