Изменение значения алфавита отдельных символов в строке путем вычисления разницы

Я пытаюсь написать небольшую функцию, которая будет переворачивать строчные буквы в их симметричные аналоги во второй половине алфавита — 26 букв = 13/13.

a = z, b = y, c = x …

Я попробовал следующий код, но по какой-то причине он работает только для первого символа.

Скажи, я ввожу «Бамба»; он начинается с переключения «b» на «y», но затем застревает и заменяет все остальные символы на «y», и я получаю «yyyyy».

Я попытался немного поиграться с кодом и обнаружил, что если я уберу зависимость от текущего символа, я могу смело увеличивать все буквы, скажем, на 1 (a = b, b = c …)

symmetric_difference = 1; **commented out** //21 - toCrypt[i];

Я осмотрелся, и самое близкое, что я нашел, было
«Изменение значения алфавита отдельных символов в строке», но это описывает способ, который кажется странным и излишним.

Может кто-нибудь сказать мне, что я сделал не так, пожалуйста (если предположить, что я сделал)?

#include <iostream>
using namespace std;

void crypto(char[]);

int  main()
{
char toCrypt[80];

cout << "enter a string:\n";
cin >> toCrypt;

crypto(toCrypt);

cout << "after crypto:\n";
cout << toCrypt;
}

void crypto(char toCrypt[]) // "Folding" encryption.
{
int size = strlen(toCrypt);
int symmetric_difference;

for (int i = 0; i < size; i++)
{
symmetric_difference = 121 - toCrypt[i];    // Calculate the difference the letter has from it's symmetric counterpart.

if (toCrypt[i] >= 97 && toCrypt[i] <= 110)  // If the letter is in the lower half on the alphabet,
toCrypt[i] += symmetric_difference; // Increase it by the difference.
else
if (toCrypt[i] >= 111 && toCrypt[i] <= 122) // If it's in the upper half,
toCrypt[i] -= symmetric_difference; // decrease it by the difference.
}
}

1

Решение

Вы можете попробовать это

for (int i = 0; i < size; i++)
{
toCrypt[i] = 'z' - toCrypt[i] + 'a';
}
3

Другие решения

В вашем примере bambaвсе символы идут в первом операторе if: toCrypt[i] += symmetric_difference;,

toCrypt[i] += symmetric_difference;
-> toCrypt[i] = toCrypt[i] + 121 - toCrypt[i];
-> toCrypt[i] = 121 = 'y'
1

Попробуйте следующее определение функции, если я не сделал опечатку.

void crypto( char s[] )
{
static const char alpha[] = "abcdefghijklmnopqrstuvwxyz";
const char *last = alpha + sizeof( alpha ) - 1;

while ( char &c = *s++ )
{
if ( const char *first = std::strchr( alpha, c ) ) c = *( last - ( first - alpha ) - 1 );
}
}

Примите во внимание, что нет необходимости, чтобы строчные буквы были упорядочены последовательно. Например, если я не ошибаюсь, это не относится к EBCDIC.

Я хотел бы заменить заявление

const char *last = alpha + sizeof( alpha ) - 1;

за

const char *last = alpha + sizeof( alpha ) - sizeof( '\0' );

но последнее не совместимо с C. 🙂

0