2017-04-13 15 views
0

私はC言語の暗号プロジェクトで作業しています。私は複数の暗号化/解読の目的で9つの関数を書く必要があります。この関数は、 'message.txt'ファイル内のテキストを読み取り、そのメッセージを暗号化/解読し(ユーザの入力に応じて)、関数が作成する新しい 'code.txt'ファイルに結果を書き込むことができるようになっています。ユーザーはキー(音部記号)と彼が望むモード(暗号/解読)を与え、関数はVigenèreメソッドに従って暗号/解読する別の関数に基づいて実行します。ここで私のコードは、(いくつかの部分はスペイン語で私はごめんなさい)暗号化/解読する機能、次にファイルの読み書き/メインとメイン()です。 (IF MODE == 0ファンクションDECIPHERS)。ファイル作成のバグ

#include <string.h> 
#include <stdio.h> 

int vigenereCipher(char *chaine, char *key, char *code, int mode) 
{ 
    int i = 0, c = 0; 

    if (mode != 0) { 
     for (; i < strlen(chaine); i++) { 
      if (chaine[i] + key[c] < 256) { 
       code[i] = chaine[i] + key[c]; 
       c += 1; 
      } else { 
       code[i] = chaine[i] + key[c] - 256; 
       c += 1; 
      } 

      if (c == strlen(key)) { 
       c = 0; 
      } 
     } 
    } else { 
     for (; i < strlen(chaine); i++) { 
      if (chaine[i] - key[c] < 0) { 
       code[i] = chaine[i] - key[c]; 
       c += 1; 
      } else { 
       code[i] = chaine[i] - key[c] + 256; 
       c += 1; 
      } 

      if (c == strlen(key)) { 
       c = 0; 
      } 
     } 
    } 

    printf("\n %s -> %s \n", chaine, code); 
    if (*chaine == *chaine) { 
     printf("\n0\n"); 
    } else { 
     printf("\n1\n"); 
    } 
} 

int encryptTextFile(char *key, int mode) 
{ 
    char chaine[99999]; 
    char code[99999]; 
    int i; 
    FILE *archivo1, *archivo2; 

    archivo1 = fopen("message.txt", "r"); 
    archivo2 = fopen("code.txt", "w"); 

    fscanf(archivo1, "%s", chaine); 

    vigenereCipher(chaine, key, code, mode); 

    for (i = 0; i < strlen(chaine); i++) { 
     fprintf(archivo2, "%c", code[i]); 
    } 

    fclose(archivo1); 
    fclose(archivo2); 
} 

int main() 
{ 
    char key[99999]; 
    int mode; 

    printf("Enter encryption key: "); 
    gets(key); 

    printf("Enter desired mode (1 or 0): "); 
    scanf("%i", &mode); 

    encryptTextFile(key, mode); 
} 

この機能は、/暗号化し、正しく解読が、それは「code.txt」で結果を書き込もうとすると、それが前に与えた同じ暗号化/解読の文字を書き込みませんファイルができます。

「code.txt」ファイルに変更された同じ文字が書き込まれるように修正するにはどうすればよいですか? ありがとうございます。 (英語に翻訳する必要がある場合は教えてください)

+3

'chiffrementVigenere'では、作成する文字列をどこで終わらせますか? –

+3

あなたのコードはMSVCから6つのコンパイラ警告を生成します。 3つは符号付き/符号なし整数比較に関係します。ある人は、「取得」は時代遅れであるとアドバイスします。 2つの関数は、必要なときに関数が値を返さないとアドバイスします。すべてのコンパイラの警告を有効にしてください。 –

+0

'すべてのコンパイラの警告を有効にしてください.'継続する前にこれらの問題を解決してください – KevinDTimm

答えて

0

strlen最初に'\0'を使用して長さを決定します。したがって、暗号化された文字列は誤ってstrlenで短縮される可能性があります。

サイズが格納されているバイトブロックを考慮すると、他の文字列表現が必要です。

+0

ありがとう、私はこれらの問題とファイル書き込みのバグを解決しました。 –

関連する問題