Шифрование с подстановочным шифром - PullRequest
0 голосов
/ 08 мая 2020

Я заменяю каждую букву алфавита другой буквой алфавита. Например, каждая буква «а» заменяется буквой «Q», а каждая буква «b» заменяется буквой «W». Я написал код для шифрования нижеследующего предложения.

#include<iostream>
#include<string>
#include<cctype>

using namespace std;

int main(){

    string alphabet {"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
    string key      {"QWERTYUIOPasdfghjklZXCVBNMqwertyuiopASDFGHJKLzxcvbnm"};

    string original {};
    string encrypted {};

    cout<<"Enter your secret message: ";
    getline(cin ,original);
    // cout<<"Encrypting message..."<<endl;

    for(int i=0;i<original.length();i++){
        if(isalpha(original.at(i)) == 1){
            encrypted.at(i) =  key.at(alphabet.find(original.at(i)));
        }
        else
            encrypted.at(i) = original.at(i);
    }

    cout<<"Encrypted message: "<<encrypted<<endl;
}

Я меняю каждый символ с индексом i в строковых алфавитах с помощью символа того же индекса из ключа. Например: - Если исходная строка = "Hello" зашифрованная строка должна быть "iTssg"

Но когда я запускаю эту программу, я получаю сообщение об ошибке

Вывод: введите секретное сообщение: Hello terminate вызывается после создания экземпляра 'std :: out_of_range' what (): basic_string :: at: __n (который равен 0)> = this-> size () (который равен 0)

Может ли кто-нибудь сказать мне какие изменения я должен внести в этот код?

1 Ответ

4 голосов
/ 08 мая 2020

Ваша строка encrypted пуста, поэтому индексация в ней с помощью .at() вызывает исключение.

Чтобы решить эту проблему, вы можете добавить символы, например:

 for(int i=0;i<original.length();i++){
        if(std::isalpha(original.at(i))){
           encrypted +=  key.at(alphabet.find(original.at(i)));
        }
        else 
           encrypted += original.at(i);
}

Вот демонстрация .

В качестве альтернативы вы можете гарантировать этот encrypted имеет тот же размер, что и original, например:

encrypted = original;

, а затем ваш l oop останется прежним.

Кроме того, вы можете упростить свой l oop, используя диапазон для l oop:

for(unsigned char c : original){
        if(std::isalpha(c)){
            encrypted +=  key.at(alphabet.find(c));
        }
        else
            encrypted += c;
    }

Вы можете еще больше упростить это, объединив 2 подхода:

string encrypted = original;
for (auto &c : encrypted)
  if (std::isalpha(c))
    c = key.at(alphabet.find(c));

Вот демонстрация .

...