2016-11-15 6 views
1

現在、代替暗号化/復号化プログラムを作成しようとしています。このプログラムはファイルから読み込み、与えられたキーに基づいて文字ごとに暗号化します。たとえば、ファイルが "ATTACK AT DAWN"であり、与えられたキーが "LEMON"である場合、結果として得られる暗号文は "LXFOPV EF RNHR"となります。代替暗号化文字が返されない

私は暗号化の機能を作っていますが、値を英数字以外の文字に変更しています。どんな助けもありがとう。私は以下の機能を貼り付けました。

void encrypt(ifstream& in_s, ofstream& out_s, char next, char& cypher, int& i, char key[]) 
{ 

    in_s.get(next); // get character from file 
    while (!in_s.eof()) 
    { 
      check_i(i); // check i value is within the constraint for key[4] 

      if(isupper(next)) // if uppercase run cypher 
      { 
        cypher = ((next - 65) + (key[i] - 65) % 26) + 65; 
      } 
      else if (islower(next)) 
      { 
        next = toupper(next); // change to upper 
        cypher = ((next - 65) + (key[i] - 65) % 26) + 65; 
        cypher = tolower(cypher); // change to lower 
      } 
      else // if blank do nothing 
      { 
        cypher = next; 
      } 
      cout << cypher; 


      in_s.get(next); // get next char 
      i++; // add 1 to i for key[i] 
    } 
} 

答えて

0

あなたはoperator precedenceに問題があります。モジュロ演算子%は、加算よりも優先度が高くなります。それでは、あなたの合計を打破してみましょう:

cypher = ((next - 65) + (key[i] - 65) % 26) + 65; 

これは次のように処理されます:あなたが実際に剰余が全部渡って行動するためだった何を望むか

cypher = (next - 65) 
     + ((key[i] - 65) % 26) 
     + 65; 

cypher = ((next - 65 + key[i] - 65) % 26) + 65; 

あなたは実際にその外側のかっこのセットを必要としませんが、それは少し読みやすくなります。

+0

ああ:私はこのような配列を格納している必要があります場合は

cout << "Please enter a 5 character key: "; cin >> key[5]; 

を!入力いただきありがとうございます。私はそれを修正しましたが、 "暗号化された"文字はまだすべて英数字ではありません。私はそれが私の重要な機能に何か間違っているかもしれないと思っています。 –

+0

プログラムの_actual_出力を見たことがなく、 'check_i'関数の定義を表示していないので、コメントするのは難しいです。 – paddy

0

問題は、私の配列の入力がどのようになっていたかです。 私はこのような何かしようとしていた:私が見

cout << "Please enter a 5 character key: "; 
cin >> key; 
関連する問題