替换密码加密

时间:2020-05-08 18:24:09

标签: c++ string c++14

我要用另一个字母替换每个字母。 例如,每个“ 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;
}

我正在用键中具有相同索引的char更改字符串字母中具有索引i的每个char。 例如:-如果原始字符串=“ Hello” 加密的字符串应为“ iTssg”

但是当我运行该程序时,我得到了一个错误

输出: 输入您的秘密信息:您好 抛出'std :: out_of_range'实例后调用终止 what():basic_string :: at:__n(0)> = this-> size()(0)

有人可以告诉我对此代码进行哪些更改吗?

1 个答案:

答案 0 :(得分:4)

您的IndexError: invalid index to scalar variable. 字符串为空,因此用encrypted对其进行索引会引发异常。

要解决此问题,您可以添加字符,如下所示:

.at()

这里是demo

或者,您可以确保 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

然后您的循环保持不变。

此外,您可以使用range-for循环来简化循环:

encrypted = original;

您可以通过组合两种方法来进一步简化此操作:

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

这里是demo