加密算法的字符串替换功能无法正常工作?
Posted
技术标签:
【中文标题】加密算法的字符串替换功能无法正常工作?【英文标题】:string replace function for encryption algorithm not working properly? 【发布时间】:2021-08-21 07:30:36 【问题描述】:我正在尝试制作一个简单的字母替换加密程序,但是在加密过程中,它以某种方式无法正常工作。请告诉我代码有什么问题。下面代码的要点是它要求输入,然后将输入发送到 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:EF0V1?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;
【问题讨论】:
除非您的目标是一些深奥的系统,否则您可以假设字母是连续编码的 ASCII。这意味着您的所有代码都可以替换为从'a'
到 'z'
的循环以及用于字符串替换的数组。
W.size() 不是 17
你在哪里检查find
是否返回-1?
为什么要将 pos 转换为 int 而不是只使用 find
返回的类型? auto n = input.find(...);
std:string::npos
很可能无法在 int
中表示;你最终可能会得到一个负值而不是一个正值。
@PatrickParker W.size()
可能是 17。implementation-defined 似乎是如何解释 "\%"
的。我试过的编译器将其转换为"%"
,使W
的大小为17。
【参考方案1】:
上面的代码将替换已经替换的字母 也就是 'a' 被替换后, 'b' 被替换会超过 'a' 替换 并替换任何“b”,我保持这种方式
string Subs[]=
"7W^S;/vB(6%I|w[fl",
"<w7>4f//Z55ZxK'z.",
"_W5g(lu<pTu3^_A7n",
"OfLm%8:EF0V1?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;
编辑:
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;
【讨论】:
感谢您的回答。也许问题本身不够具体,但你能不能让代码继续到原始输入的下一个字符进行替换,而不是在已经替换的字符串中进行替换,如果不是无限循环,这将创建一个相当长的循环。我希望这是有道理的。 我调整了函数,让它从原始输入跳转到下一个字母 谢谢。它工作得很好。一个问题。我怎样才能加密一个空格并在空格后面得到字符串?【参考方案2】:有几个问题
std::string::replace
的第二个参数应该是要替换的字符数,即1
您未能针对std:string::npos
测试find
结果,因此它将无限循环。 (-1 总是小于字符串长度)
W.size()
不是17
.. 是吗?删除流浪\
或将其转义为\\
更多错误...(不是完整列表。请参阅 Errorist 的回答)
此外,还有大量的代码重复很容易避免。
最后,在以后的问题中,请比说代码“不起作用”更具体。它在哪些方面不起作用?说出来。
【讨论】:
以上是关于加密算法的字符串替换功能无法正常工作?的主要内容,如果未能解决你的问题,请参考以下文章