コードには多くの正確性と文体の問題があります。
正確性の問題
ループ変数m_inp
は初期化されていません。
unsigned char
が に等しくなる可能性はほとんどありませんEOF
。の値EOF
は -1 です。ループが終了することはありません (非常に奇妙なアーキテクチャを使用している場合を除きます)。
従来の Caesar 暗号は、ASCII 文字セット全体ではなく、アルファベット順に動作します。
文体の問題
より「スタイル的に正しい」C を使用すると、他のプログラマーがコードを読みやすくなります。これらは主観的なものです。
この名前m_inp
は、短いループ内のループ変数の名前として不適切です。i
代わりに使用してください。
C ではまったく同等ですが、ptr[i]
の代わりに読みやすいです。*(ptr + i)
入力を としてマークするconst unsigned char *
と、変更されていないことがより明確になります。
オフセットのint
代わりに使用します。char
従来、関数の出力は左側に、入力は右側に配置されます。ただし、これは重要ではありません。
改訂されたコード
これがリビジョンのサンプルです。NUL で終了する文字列を受け取り、Caesar でエンコード/デコードされたバージョンを出力バッファーに書き込みます。これは私が関数を書く方法であり、必ずしもあなたがそれを書く方法ではありません:
void caesar(char *output, const char *input, int shift)
{
int i;
for (i = 0; input[i]; i++) {
if (input[i] >= 'a' && input[i] <= 'z')
output[i] = (input[i] - 'a' + shift) % 26 + 'a';
else if (input[i] >= 'A' && input[i] <= 'Z')
output[i] = (input[i] - 'A' + shift) % 26 + 'A';
else
output[i] = input[i];
}
output[i] = '\0';
}
Caesar の暗号化と復号化は、シフト値が異なるだけで、実際には同じ操作であることに注意してください。したがって、シフト 3 で暗号化すると、シフト -3 (または同等の 23) で復号化できます。
unsigned char
また、置き換えることchar
もその逆も可能であり、すべてがまったく同じように機能することに注意してください(ただし、入力をキャストする必要があります)。