加密算法的字符串替换功能无法正常工作?

string replace function for encryption algorithm not working properly?

我正在尝试制作一个简单的字母替换加密程序,但在加密过程中,它无法正常工作。请告诉我代码有什么问题。下面代码的要点是它要求输入,然后将输入发送到 ReplaceLowercase 函数,该函数查看每个字母,直到在输入字符串中找到对应的字母,然后将其替换为 17 个字符的字符串在第一部分定义,然后继续加密下一个字母。

#include <iostream>
using namespace std;

string ReplaceLowercase(string input){
    string A = "7W^S;/vB(6%I|w[fl";
    string B = "<w7>4f//Z55ZxK'z.";
    string C = "_W5g(lu<pTu3^_A7n";
    string D = "OfLm%8:EF}0V1?BSS";
    string E = "|+E6t;AZ~XewXP17T";
    string F = "L-nIbhm5<z:92~+;x";
    string G = "L-nIbhm5<z:92~+;x";
    string H = "9bC5f0q@qA(RKZ>|r";
    string I = "9bC5f0q@qA(RKZ>|r";
    string J = "k=5;ln(08IAl(gGAK";
    string K = "|N;8]dGu)'^MaYpu[";
    string L = "!&;Y*nz8C*;J}{+d]";
    string M = "Us9%^%?n5!~e@@*+@";
    string N = "zF8,1KV#¥]$k?|9R#";
    string O = "0B4>=nioEjp>4rhgi";
    string P = "EG@0[W9.N4i~E<f3x";
    string Q = "(0Pwkk&IPchJHs.7A";
    string R = "7XgmQ6fW<|J+NY[m0";
    string S = ".g4CwX/DU!!~!zbtZ";
    string T = "+_U'qn_/9Fo|gT/!n";
    string U = "=0s(mYh&F%y=MBS5(";
    string V = "cg71(}bo+Q5P8F[T6";
    string W = "lc|a\%5.9pOpooU+QR";
    string X = "E_(3A:o+.]qL3MYA6";
    string Y = "H@O'X_RiVS@8l0bKD";
    string Z = "Y1gbGD`~8d>HSWN35";
    

    int n = input.find("a",0);
    while(n < input.length()){
        input.replace(n,A.size(),A); 
        n=input.find("a",n+17);
    }

    n =input.find("b",0);
    while(n < input.length()){
        input.replace(n,B.size(),B); 
        n=input.find("b",n+17);
    }

    n =input.find("c",0);
    while(n < input.length()){
        input.replace(n,C.size(),C); 
        n=input.find("c",n+17);
    }

    n =input.find("d",0);
    while(n < input.length()){
        input.replace(n,D.size(),D); 
        n=input.find("d",n+17);
    }

    n =input.find("e",0);
    while(n < input.length()){
        input.replace(n,E.size(),E); 
        n=input.find("e",n+17);
    }

    n =input.find("f",0);
    while(n < input.length()){
        input.replace(n,F.size(),F); 
        n=input.find("f",n+17);
    }

    n =input.find("g",0);
    while(n < input.length()){
        input.replace(n,G.size(),G); 
        n=input.find("g",n+17);
    }

    n =input.find("h",0);
    while(n < input.length()){
        input.replace(n,H.size(),H); 
        n=input.find("h",n+17);
    }

    n =input.find("i",0);
    while(n < input.length()){
        input.replace(n,I.size(),I); 
        n=input.find("i",n+17);
    }

    n =input.find("j",0);
    while(n < input.length()){
        input.replace(n,J.size(),J); 
        n=input.find("J",n+17);
    }

    n =input.find("k",0);
    while(n < input.length()){
        input.replace(n,K.size(),K); 
        n=input.find("k",n+17);
    }

    n =input.find("l",0);
    while(n < input.length()){
        input.replace(n,L.size(),L); 
        n=input.find("l",n+17);
    }

    n =input.find("m",0);
    while(n < input.length()){
        input.replace(n,M.size(),M); 
        n=input.find("m",n+17);
    }

    n =input.find("n",0);
    while(n < input.length()){
        input.replace(n,N.size(),N); 
        n=input.find("n",n+17);
    }

    n =input.find("o",0);
    while(n < input.length()){
        input.replace(n,O.size(),O); 
        n=input.find("o",n+17);
    }

    n =input.find("p",0);
    while(n < input.length()){
        input.replace(n,P.size(),P); 
        n=input.find("p",n+17);
    }

    n =input.find("q",0);
    while(n < input.length()){
        input.replace(n,Q.size(),Q); 
        n=input.find("q",n+17);
    }

    n =input.find("r",0);
    while(n < input.length()){
        input.replace(n,R.size(),R); 
        n=input.find("r",n+17);
    }

    n =input.find("s",0);
    while(n < input.length()){
        input.replace(n,S.size(),S); 
        n=input.find("s",n+17);
    }

    n =input.find("t",0);
    while(n < input.length()){
        input.replace(n,T.size(),T); 
        n=input.find("t",n+17);
    }

    n =input.find("u",0);
    while(n < input.length()){
        input.replace(n,U.size(),U); 
        n=input.find("u",n+17);
    }

    n =input.find("v",0);
    while(n < input.length()){
        input.replace(n,V.size(),V); 
        n=input.find("v",n+17);
    }

    n =input.find("w",0);
    while(n < input.length()){
        input.replace(n,W.size(),W); 
        n=input.find("w",n+17);
    }

    n =input.find("x",0);
    while(n < input.length()){
        input.replace(n,X.size(),W); 
        n=input.find("x",n+17);
    }

    n =input.find("y",0);
    while(n < input.length()){
        input.replace(n,Y.size(),Y); 
        n=input.find("y",n+17);
    }

    n =input.find("z",0);
    while(n < input.length()){
        input.replace(n,Z.size(),Z); 
        n=input.find("z",n+17);
    }
    return input;
}

int main(){
    string input;
    cin >> input;
    input = ReplaceLowercase(input);
    cout << input << std::endl;
    cout << "encryption complete" << endl;
    return 0;
}

有几个问题

  1. std::string::replace的第二个参数应该是要替换的字符数,即1

  2. 您未能根据 std:string::npos 测试 find 结果,因此它将无限循环。 (-1 总是小于字符串长度)

  3. W.size() 不是 17.. 或者是?删除杂散的 \ 或将其转义为 \

  4. 更多错误...(不是完整列表。请参阅 Errorist 的回答)

此外,还有大量的代码重复可以很容易地避免。

最后,在以后的问题中,请比说代码“不起作用”更具体。它在哪些方面不起作用?告诉那个。

上面的代码将替换已经被替换的字母
也就是说,'a'被替换后,替换'b'会遍历'a' substitue
并替换任何 'b',我保持原样

string Subs[]=
{
    "7W^S;/vB(6%I|w[fl",
    "<w7>4f//Z55ZxK'z.",
    "_W5g(lu<pTu3^_A7n",
    "OfLm%8:EF}0V1?BSS",
    "|+E6t,AZ~XewXP17T",
    "L-nIbhm5<z:92~+,x",
    "L-nIbhm5<z:92~+,x",
    "9bC5f0q@qA(RKZ>|r",
    "9bC5f0q@qA(RKZ>|r",
    "k=5,ln(08IAl(gGAK",
    "|N,8]dGu)'^MaYpu[",
    "!&,Y*nz8C*,J}{+d]",
    "Us9%^%?n5!~e@@*+@",
    "zF8,1KV#¥]$k?|9R#",
    "0B4>=nioEjp>4rhgi",
    "EG@0[W9.N4i~E<f3x",
    "(0Pwkk&IPchJHs.7A",
    "7XgmQ6fW<|J+NY[m0",
    ".g4CwX/DU!!~!zbtZ",
    "+_U'qn_/9Fo|gT/!n",
    "=0s(mYh&F%y=MBS5(",
    "cg71(}bo+Q5P8F[T6",
    "lc|a\%5.9pOpooU+QR",
    "E_(3A:o+.]qL3MYA6",
    "H@O'X_RiVS@8l0bKD",
    "Y1gbGD`~8d>HSWN35"
};

string ReplaceLowercase(string input)
{
    for(char cChar = 'a'; cChar <= 'z'; cChar++)
    {
        size_t n = input.find(cChar, 0);
        
        string CurSub   =   Subs[cChar-97]; //  cChar-97 to get zero-based index into Subs
        
        while(n < input.length())
        {
            input.replace(n, CurSub.size(), CurSub);
        
            n   =   input.find(cChar, n+CurSub.size());
        }
    }
    
    return input;
}

int main(void)
{
    string input;
    
    cin >> input;
    
    input = ReplaceLowercase(input);
    
    cout << input << std::endl;
    cout << "encryption complete" << endl;

    return 0;
}

EDIT:

string ReplaceLowercase(string input)
{
    for(size_t pos = 0; pos<input.length(); )
    {
        char cChar  =   input[pos];
        
        if(cChar>='a' && cChar<='z')    //  it's lowercase
        {
            string CurSub   =   Subs[cChar-97]; //  cChar-97 to get zero-based index into Subs
            
            //  replace cChar with corresponding Sub
            input.replace(pos, 1, CurSub);
            
            //  Skip to the next letter in original input
            //  by jumping over newly inserted Sub
            pos +=  CurSub.length();
        }
        else    //  not lowercase, next
            pos++;
    }
    
    return input;
}