2

C ++でシーザー暗号プログラムを作成しようとしています。私は 4 つの関数を使用します。1 つは shift key を選択するため、2 つは暗号化と復号化のため、最後は入力ファイルを使用してテキストを読み取り、暗号化または復号化されたテキストを出力ファイルに出力するシーザー暗号を実装するためのものです。コードを実行しようとしていますが、クラッシュしています。問題はシーザー関数のどこかにあると思います。しかし、私は正確に何であるかを知りません。何か案は?これは私のコードです:

#include <iostream>
#include <fstream>
using namespace std;

int chooseKey()
{
    int key_number;
    cout << "Give a number from 1-26: ";
    cin >> key_number;

    while(key_number<1 || key_number>26)
    {
        cout << "Your number have to be from 1-26.Retry: ";
        cin >> key_number;  

    }
    return key_number;
}

void encryption(char *w, char *e, int key){

    char *ptemp = w;


    while(*ptemp){

        if(isalpha(*ptemp)){

        if(*ptemp>='a'&&*ptemp<='z')  
         {  
             *ptemp-='a';  
             *ptemp+=key;  
             *ptemp%=26;  
             *ptemp+='A';  
         }  


        }
        ptemp++;
    }

    w=e;

}

void decryption (char *e, char *w, int key){
    char *ptemp = e;


    while(*ptemp){

        if(isalpha(*ptemp))
        {

            if(*ptemp>='A'&&*ptemp<='Z')  
            {  
             *ptemp-='A';  
             *ptemp+=26-key;  
             *ptemp%=26;  
             *ptemp+='a';  
            }  


        }
        ptemp++;
    }

    e=w;

}

void Caesar (char *inputFile, char *outputFile, int key, int mode)
{
     ifstream input;
     ofstream output;
     char buf, buf1;  
     input.open(inputFile);  
     output.open(outputFile);  
     buf=input.get();
     while(!input.eof())  
     {  
        if(mode == 1){
            encryption(&buf, &buf1, key);
        }else{
            decryption(&buf1, &buf, key);
        }
        output << buf;
        buf=input.get();
     }
     input.close();  
     output.close();
}

int main(){

    int key, mode;
    key = chooseKey();
    cout << "1 or 0: ";
    cin >> mode;
    Caesar("test.txt","coded.txt",key,mode);
    system("pause");
}

これが私のプログラムの詳細です。私のコードのテンプレートは私の投稿の上にあります。

パラメータw は先頭のテキストで、par eは復号化されたテキストです。w* テキストにシフト キーを追加して *e を取得すると、暗号化が行われます。逆の手順で復号化関数を作成します。暗号化されたテキスト(* e)があり、復号化されたテキスト(* w)を取得したいので、chooseKey関数から取得したキーシフトを差し引きます。Caesar 関数では、いくつかのデータを含む入力ファイルを使用し、代わりに暗号化または復号化されたテキストを出力ファイルに抽出したいと考えています。私はすでに暗号化および復号化関数を実装していますが、私の問題は Caesar 関数でそれらを使用する方法です。望ましい結果が得られず、プログラムがクラッシュしています。私の間違いに言及してください。解決策はありますか?

4

1 に答える 1