В функции расшифровки таится баг
В общем, я пишу алгоритм шифра цезаря.
Но в коде функции расшифровщика decode() спрятался баг...
Например, если я кодирую слово hello world с ключом 10, то encode() возращает rovvy gybvn, НО decode() hello old.
И что главное я заметил, чем больше значение ключа, тем больше decode() съедает букв.
К примеру: hello world с ключом 20 decode() возращает вообще e d
#include <iostream>
#include <string>
using namespace std;
string* encode(string* w, int k, string chars) {
string res = *w;
for (int i = 0; i < w->size(); ++i) {
if (res[i] != ' ') {
int p = chars.find(res[i]);
res[i] = chars[p + k];
} else {
res[i] = res[i];
}
}
*w = res;
return w;
}
string* decode(string* w, int k, string chars) {
string res = *w;
for (int i = 0; i < w->size(); ++i) {
if (res[i] != ' ') {
int p = chars.find(res[i]);
res[i] = chars[p - k];
} else {
res[i] = res[i];
}
}
*w = res;
return w;
}
int main(int argc, char* argv[])
{
string word;
int key = 0;
string chars;
for (char n = 97; n < 123; ++n)
chars += n;
chars += chars;
cout << "Word >> ";
getline(cin, word);
string *pword = &word;
cout << word << endl;
cout << "Key (0-25) >> ";
cin >> key;
encode(pword, key, chars);
cout << *pword << endl;
decode(pword, key, chars);
cout << *pword << endl;
return 0;
}
Ответы (1 шт):
Автор решения: lakvak
→ Ссылка
Нужно было в decode() начинать искать символ с 25 элемента в chars.
string* decode(string* w, int k, string chars) {
string res = *w;
for (int i = 0; i < w->size(); ++i) {
if (res[i] != ' ') {
int p = chars.find(res[i], 25);
res[i] = chars[p - k];
} else {
res[i] = res[i];
}
}
*w = res;
return w;
}