用替换密码加密

问题描述 投票:0回答:1

我将每个字母替换为另一个字母,例如,每个'a'被替换为'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"

但当我运行这个程序时,我得到一个错误信息

输出:输入你的秘密信息。在抛出一个'std::out_of_range'实例后调用了Helloterminate what(): basic_string::at: __n (是0) >= this->size() (是0)

谁能告诉我,我应该在这段代码中做哪些修改?

c++ string c++14
1个回答
4
投票

您的 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;

然后你的循环就会保持不变

另外,你也可以简化你的循环,使用一个range-for循环。

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

你可以把这两种方法结合起来,进一步简化。

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

这里有一个 演示.

© www.soinside.com 2019 - 2024. All rights reserved.