1

各文字に 10 を追加してファイルを暗号化するプログラムを作成しています。どういうわけか、プログラムの作業ディレクトリの一部がファイルに出力されていますが、その理由はわかりません。

#include <stdio.h>
    int main(void){
        FILE *fp;
        fp=fopen("tester.csv","r+");
        Encrypt(fp);      
        fclose(fp);
    }

    int Encrypt(FILE *fp){
        int offset=10;
        Shift(fp, offset);
    }
    int Decrypt(FILE *fp){
        int offset= -10;
        Shift(fp, offset);
    }
    int Shift(FILE *fp, int offset){
        char line[50],tmp[50], character;
        long position;
        int i;
        position = ftell(fp);
        while(fgets(line,50,fp) != NULL){
            for(i=0;i<50;i++){
                character = line[i];
                character = (offset+character)%256;
                tmp[i] = character; 
                if(character=='\n' || character == 0){break;}                
            }
            fseek(fp,position,SEEK_SET);
            fputs(tmp,fp);
            position = ftell(fp);
            fseek(stdin,0,SEEK_END);
        }
      }

ファイルはもともと読み取ります

this, is, a, test
i, hope, it, works!

プログラムの実行後:

~rs}6*s}6*k6*~o}~
/alexio/D~6*y|u}+
k6*~o}~
/alexio/D

users/alexio/Desktop はパスの一部です。これはどのように起こりますか?

4

3 に答える 3

5

文字列を「エンコード」するため、null で終了しないか (あなたの場合)、文字列の末尾の前でも null が含まれます (文字 + オフセット % 256 == 0)。後で文字列として書き込もうとすると、バッファがオーバーランし、プログラム引数の一部が出力されます。

とを使用freadfwriteます。

于 2012-11-16T01:49:57.967 に答える
3

この線

fputs(tmp,fp);

おそらくnullではない終了文字列を書き出します。そのため、null が見つかるまでメモリをファイルにコピーし続けます。

ループが改行で切れる場合は、「tmp」の最後に null を追加する必要があります。

于 2012-11-16T01:49:24.750 に答える
2

いくつかのこと:

  1. で実際に読み取られた文字数に関係なく、読み取りバッファーから 50 文字すべてをエンコードしていますfgets()は、バッファ全体ではなく、行fgets()を読み取ることを思い出してください(行がバッファよりも長く、あなたの行が ではない場合を除きます)。行ファイル入力からの文字列の長さを超えるものは、スタック ガベージです。

  2. とにかく使用してはならないtmp[]書き込みの前に文字列を終了しないことにより、余分なガベージデータをすべてダンプしています。fputs()まだスタックゴミ。

解決。このエンコーディングにはfread()とを使用します。fwrite()文字列関数を使用する理由はまったくありません。デコーダーを作成するときはfread()fwrite()

于 2012-11-16T01:52:10.237 に答える