Логическая ошибка при получении вывода из программы шифрования строк. - PullRequest
0 голосов
/ 10 сентября 2018

Я создал программу, которая переводит строку в класс EncryptedString, а затем шифрует указанную строку, удаляя все, что не является пробелом, строчными или заглавными буквами. Кажется, все работает нормально, пока я не ввожу строку с чем-то вроде 496496 # @ ###! # !!! 4, затем удаляет одни и сохраняет другие. У меня есть несколько примеров того, что должно быть выведено.

  • Ввод: Hello World!
  • Ожидаемый расшифрованный: Hello World
  • Ожидаемое шифрование: Ifmmp Xpsme
  • Вывод расшифрован: Hello World
  • Выход зашифрован: Ifmmp Xpsme

Hello World работает, просто отлично и удаляет!

Однако, когда я пытаюсь сделать "Яблоко сбежало осенью z !! 14? Я получаю это

  • Вход: яблоко сбежало осенью z !! 14?
  • Ожидается Расшифровано: осенью сбежало яблоко z
  • Ожидается в зашифрованном виде: B bqqmf sbo bxbz jo bvuvno a
  • Вывод расшифрован: яблоко сбежало осенью z 3
  • Вывод зашифрован: B bqqmf sbo bxbz jo bvuvno a! 4

А вот еще один пример.

  • Ввод: Эмили Дикинсон1152163 !!! @@ # @ # !!!
  • Ожидается расшифровка: Эмили Дикинсон
  • Ожидаемое шифрование: Fnjmz Ejeljotpo
  • Расшифровано: Эмили Дикинсон015 ??
  • Вывод зашифрован: Fnjmz Ejdljotpo126 !! @@ !!

Я подумал, что, может быть, когда я перебираю код для decrypt.length () и enCry.length (), он перебирает элементы? Тем не менее, я чувствовал, что это не так, поскольку он может просто удалять другие цифры и символы, но по некоторым причинам некоторые остаются. Есть ли что-то не так с моим кодом ниже во время моих итераций, что может вызвать это?

    //This function takes the phrase,word or sentence and encrypts it, removing any illegal characters aside from ' ' and then proceeds to decrypt it then output them to the get functions. 
void EncryptedString::set(string str)
{
    char chBase = 'A';


    string enCry = str;
    for (int i = 0; i < enCry.length(); i++)
    {
        char ch = enCry[i];

        if (enCry[i] < chBase && enCry[i] != ' ')
        {
            enCry.erase(enCry.begin() + i);
        }
        else if (enCry[i] > chBase + 25 && enCry[i] < tolower(chBase) && enCry[i] != ' ')
        {
            enCry.erase(enCry.begin() + i);
        }
        else if (enCry[i] > tolower(chBase + 25) && enCry[i] != ' ')
        {
            enCry.erase(enCry.begin() + i);
        }
        else
        {
            if (enCry[i] == chBase + 25)
            {
                enCry[i] = 'A';
            }
            else if (enCry[i] == tolower(chBase) + 25)
            {
                enCry[i] = 'a';
            }
            else if (enCry[i] == ' ')
            {
                enCry[i] = ' ';
            }
            else
            { 
            enCry[i] = ch + 1;
            }

        }


    }

    EncryptedString::encryption = enCry;
    string decrypt = enCry;

    for (int i = 0; i < decrypt.length(); i++)
    {
        char ch = decrypt[i];

        if (decrypt[i] == 'A')
        {
            decrypt[i] = 'Z';
        }
        else if (decrypt[i] == 'a')
        {
            decrypt[i] = 'z';
        }
        else if (decrypt[i] == ' ')
        {
            decrypt[i] = ' ';
        }   
        else
        {
            decrypt[i] = ch - 1;
        }
    }

    decrypted = decrypt;
}


//This function outputs the decryption after the phrase was encrypted. 
const string EncryptedString::get()
{

    return decrypted;
}   
//This function outputs the encryption of the phrase. 
const string EncryptedString::getEncrypted()
{
    return EncryptedString::encryption;
}

Более подробная информация приведена в файле main.cpp, где я использую эти функции. Я подумал, может быть, это потому, что я устанавливал его дважды в test2, но я тестировал test1, добавляя числа в hello world, и этот вывод просто сохранял некоторые числа с ним. Если вам нужно увидеть этот пример, я приведу.

#include "EncryptedString.h"
#include <windows.h>

int main()
{
    cout << "TEST 1" << endl << endl;
    EncryptedString test1("Hello World!");
    cout << test1.get();
    cout << endl << endl;
    cout << test1.getEncrypted();

    cout << endl << endl << "TEST 2" << endl << endl;


    EncryptedString test2;
    test2.set("A apple ran away in autumn z!!14?");
    cout << endl << endl;
    cout << test2.get();
    cout << endl << endl;
    cout << test2.getEncrypted();

    cout << endl << endl; 
    test2.set("Emily Dickson1152163!!!@@#@#!!!");
    cout << test2.get() << endl << endl << test2.getEncrypted();

    //being used for me to see the output. 
    Sleep(15000);
}

Если кто-то увидит, где я ошибся, или если что-то не так с моей итерацией, я был бы благодарен. Спасибо всем, кто прочитал все это, поскольку я знаю, что это, вероятно, очень много, и спасибо за любую помощь, которую вы можете мне оказать. Также это будет считаться логической ошибкой или структурной ошибкой? Я верю логике, но я могу ошибаться, и мне хотелось бы знать, чтобы я не допустил этой ошибки в будущем при обращении за помощью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...