В функции расшифровки таится баг

В общем, я пишу алгоритм шифра цезаря.

Но в коде функции расшифровщика 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;
}
→ Ссылка