2017-05-31 27 views
-4

キーに応じて文字列をシフトする関数を作成する必要があります。たとえば、フレーズが「AAAAAA」で、キーが「CDE」の場合、出力は「DEFDEF」でなければなりません。これまでに私は思いつきましたC++コードの暗号化チェック

string encrypt(string phrase, string key){ 
    string final; 
    for(int j = 0; j <= key.length()-1; j++){ 
     for(int i=j; i <= phrase.length()-1; i += key.length()){ 
      int int_phr = phrase[i]; 
      int int_key = key[j]; 
      char temp = int_phr+int_key-96; 
      final += temp; 
    } 
} 
return final; 

しかし、私は "D"を得るために "A"と "C"を追加することでエラーが発生し続けます。

アドバイスはありますか?彼らのASCII値が97で起動するので、int_keyが小文字だった場合、これは正しいだろう

char temp = int_phr + int_key - 96; 

+0

これはVIgenere Cipherと呼ばれます。 Googleには、たくさんのコード例があります。 – Barmar

+1

「エラー」とは何ですか? –

答えて

2

問題は中96の減算です。大文字は65から始まるので、代わりに96を引く必要があります。両方のケースを扱うことができます:

const char lower_base = 'a' - 1; 
const char upper_base = 'A' - 1; 
char temp = int_phr + int_key - (islower(int_key) ? lower_base : upper_base); 

ハードコードされた数字を削除し、その文字を使用してベースを決定しました。

また、アルファベットの末尾に移動したときに折り返しを許可する必要があります。モジュラス演算子でこれを行うことができます。

char phr_base = islower(int_phr) ? lower_base : upper_base; 
char phr_offset = int_phr - phr_base; 
char adjust = int_key - (islower(int_key) ? lower_base : upper_base); 
char temp = phr_base + (phr_offset + adjust) % 26; 
final += temp;