У меня есть некоторые проблемы при создании функции, которая шифрует слово, используя число вращения, которое вводит пользователь. Вот что у меня так далеко:
string encryptWord(string word, int num)
{
string newWord;
newWord = word;
for(int i = 0; i < word.length(); i++)
{
newWord[i] = tolower(word[i]);
if((word[i] >= 'a') && (word[i] <= 'z'))
{
newWord[i] = word[i] + (num % 26);
if(newWord[i] > 'z')
newWord[i] = newWord[i] - 26;
}
}
return newWord;
}
теперь в моей главной, когда я проверяю это с
cout << encryptWord("xyz", 6);
вывод я получаю: де
Точно так же для расшифровки у меня есть
string decryptRotWord(string word, int num)
{
string newWord;
num = num % 26;
int index;
for(int i = 0; i < word[i]; i++)
{
newWord[i] = tolower(word[i]);
if(word[i] >= 'a' && word[i] <= 'z')
{
index = word[i] - num;
if(index < 'a')
index = index + 26;
newWord[i] = index;
}
}
return newWord;
}
однако для этого он ничего не выводит, когда я тестирую с
cout << decryptRotWord("vdds", 2);
В вашей функции дешифрования, я думаю, у вас есть ошибка в условии завершения цикла:
for(int i = 0; i < word[i]; i++)
Как и в функции шифрования, вы должны выполнять итерацию по длине
for(int i = 0; i < word.length(); i++)
Когда ваш for
цикл прибывает к письму 'z'
, оно делает 'z' + 6
, Но это выходит за рамки максимальной длины char
(127). Вы получаете неопределенное поведение от этого.
Вы должны реализовать способ начать отсчет с 'a'
всякий раз, когда вы проверяете шифрование выходит за рамки 'z'
,
Для расшифровки, как уже упоминалось ранее, вы хотите проверить:
i < word.length()