これはそれを行う必要があります:
if (isupper(p[i])){
char c = (p[i] - 'A' + 26 - k) % 26) + 'A';
}
は+ 26
あなたにあなたのラッピングを与えます
このように考えてください(3桁の数値形式は、物事をうまく並べるためだけのものです):
| 000 | 001 | 002 | ... | 024 | 025 | plain
| A | B | C | ... | Y | Z |
| 003 | 004 | 005 | ... | 001 | 002 | crypto
今、それを認識してください
(n + 26) % 26 === (n % 26)
それで:
| 000 | 001 | 002 | ... | 024 | 025 | plain
| A | B | C | ... | Y | Z |
| 029 | 030 | 031 | ... | 053 | 054 | crypto
26を法とする場合、上記と同等です。
これにより、生活がずっと楽になります。平文記号セットは、からまでの連続した整数のセットで構成さ'A'
れ'A' + 25
ます。問題は、暗号文シンボルセットが連続していないことです...で不連続性があり025
ます。'A' + k + 26
26を追加することにより、暗号文をからまでの連続した範囲に変換できます'A' + k + 49
。
隣接する暗号文シンボルセットを平文シンボルセットにマップする方がはるかに簡単です。
シーザーコードはどちらの方向にもシフトする可能性があり、復号化は正反対のシフトであるため、これを次のように組み合わせることができます。
boolean decrypt;
int k;
...
k = k % 26; // Ensure that the shift doesn't include any wrapping
if(decrypt) {
k *= -1;
}
if (isupper(p[i])){
char c = (p[i] - 'A' + 26 + k) % 26) + 'A';
}