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 < 10j >= 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 であるとコメントされています。ただし、ファイルの最後に改行がある可能性があります (改行がない場合でも改行する編集者もいます)。これがバグの原因です。

gets とは異なり、fgets はバッファーに改行文字を含めることに注意してください ( fgetsを参照)。

于 2012-04-16T11:02:49.050 に答える
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 に答える
0

ここに 1 つの問題があります。

fputc(length,output);

lengthこれは、 (である) の最下位 (最下位) バイトのみをint出力ファイルに書き込みます。バイナリ形式で書き込みますが、これは拡張子付きで開かれたファイルには非常に奇妙に思えます.txt

あなたはおそらく欲しい:

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