Проблема в том, что оператор по модулю не всегда возвращает положительное значение:
-1 % 26
дает -1
, что заставляет вашу функцию decrypt_ltr
возвращать символ вне диапазона 'a'
- 'z'
(или диапазона 'A'
- 'Z'
). Например, при расшифровке «a
» с ключом 2 вы получите: 'a' - 'a' - key
= -key
. Затем вы выполните -key + 'a'
, что по-прежнему меньше 'a'
.
Поскольку ваш ключ гарантированно находится в диапазоне от 1 до 26, вы можете просто добавить 26 к значению (alpha-'A') - key
, например:
char decrypt_ltr(char alpha, int key)
{
if (alpha >= 'A' && alpha <= 'Z')
{
alpha = ((alpha-'A') - key + 26) % 26 + 'A'; // the 26 ensures that the value
// is positive before the modulo
// operator is applied and is
// removed by the modulo operator
}
else if(alpha >= 'a' && alpha <= 'z')
{
alpha = ((alpha-'a') - key + 26) % 26 + 'a';
}
return alpha;
}