Вы неправильно реализуете Цезарский шифр. Ваш код включает в себя следующую строку, которая является неправильным:
printf("%c", message[i] + shift);
Чтобы сделать это правильно, вы хотите, чтобы преобразовать его в функцию:
printf("%c", encrypt(message[i], shift));
И давайте реализовать функцию:
char encrypt(char input, int shift) {
if (input >= 'a' && input <= 'z')
return ((input - 'a' + shift) % 26) + 'a';
if (input >= 'A' && input <= 'Z')
return ((input - 'A' + shift) % 26) + 'A';
return input;
}
И просто объяснить, что математика делает в этой функции:
input - 'a'
указывает, какая позиция в алфавите является входом (при условии, что ввод представляет собой строчную букву). Так что если вход 'c'
, то мы получим 2
назад. Если вход 'z'
, мы получаем 25
.
input - 'a' + shift
получает новую позицию персонажа, который мы используем для шифрования. Обратите внимание, что это может быть большее число, чем алфавит (26 символов).
- Чтобы решить эту проблему, мы используем модульную арифметику, чтобы связать это число между
[0 - 25]
.
- Затем добавление 'a' к этому символу дает нам фактический символ, который мы хотим напечатать.
Обратите внимание, что это работает только потому, что коды символов для a
в z
и A
к Z
последовательны.
Когда вы запускаете что-то под Xcode, оно запускается под отладчиком. LLDB - один из отладчиков, которые могут использоваться. Ваш вывод должен появиться в консоли отладчика. –
Если вы не пытаетесь заставить Xcode делать шифрование (что маловероятно, так как это не инструмент защиты данных, а IDE), это не имеет ничего общего с Xcode **. –
@ H2CO3 - В этом случае я подозреваю, что это * имеет отношение к Xcode, в том смысле, что он не знает, как его использовать. Например, чтобы передать параметры, нужно выполнить настройки проекта (я забыл точное заклинание). –