1

ファイルを 1 行ずつ調べて (各行は 50 文字以下)、各文字を 10 または -10 ずつシフトして (暗号化および復号化するため)、シフトされた文字列を古い文字列があった場所に出力しようとしています。しかし、私は本当に面白い出力を得ています。

コードは次のとおりです。

#include <stdio.h>
int main(void){
    FILE *fp;
    fp=fopen("tester.csv","r+");
    Encrypt(fp);      // I call decrypt here when I test it.
    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 = (character+offset)%256;
            tmp[i] = character;                 
        }
        fseek(fp,position,SEEK_SET);
        fputs(tmp, fp);
        position = ftell(fp);
    }
}

したがって、tester.csv が最初に読み取る場合

this, is, a, test

プログラムを実行すると生成されます

~rs}6*s}6*k6*~o}~
























êñv[    ‰

this, is, a, test
4

3 に答える 3

3
fputs(tmp, fp);

fputs終了する0バイトまでバイトを書き込みます。

while(fgets(line,50,fp) != NULL){
    for(i=0;i<50;i++){
        character = line[i];
        character += offset;
        tmp[i] = character;                 
    }

char読み込んだ行の長さに関係なく、50秒シフトします。したがって、ほとんどの場合、tmpバッファに0バイトがないためfputs、少なくとも50バイトが書き込まれることが多く、その一部は関係ありません。その場所で、バッファを超えてファイルにあったもの。これにより、未定義の動作が呼び出され、クラッシュが発生する可能性があります。

ループ内で終了する0バイトを確認する必要があります。おそらく、改行で停止することもお勧めします。

while(fgets(line,50,fp) != NULL){
    for(i = 0; i < 50 && line[i] != 0 && line[i] != '\n'; i++){
        character = line[i];
        character += offset;
        tmp[i] = character;                 
    }

注:ループ本体はより単純になりますline[i] += offset;

于 2012-11-16T00:50:31.507 に答える
2

GDB を使用して、プログラムの暗号化をデバッグしてみてください。

コンパイル: gcc -g -Wall YOURPROGRAM.cxx

gdb を実行します。 gdb YOURPROGRAM.cxx

ブレークポイントを設定します。

3 行目で改行します。break 3

プログラムをデバッグします。run

stepとを使用してコードの各行をステップ実行しnext、 を使用して各ポイントで変数を出力できますprint VARIABLENAME。これは強力なプログラムであり、デバッグに非常に役立ちます。

于 2012-11-16T00:43:45.227 に答える
1

暗号化の出力データと復号化の入力データでNUL 文字を取得する可能性があるため、おそらく行指向の を使用しないでfgets()ください(改行は . と を使用してください. 適切な文字数も処理するようにしてください) ;は 49 文字と NUL を返さないかもしれません; 行はもっと短いかもしれませんが、とにかく NUL を処理したくありません。fputs()'\0'fread()fwrite()fgets()

于 2012-11-16T00:55:12.910 に答える