加密算法的字符串替换功能无法正常工作?
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;
}
有几个问题
std::string::replace
的第二个参数应该是要替换的字符数,即1
您未能根据 std:string::npos
测试 find
结果,因此它将无限循环。 (-1 总是小于字符串长度)
W.size()
不是 17
.. 或者是?删除杂散的 \
或将其转义为 \
更多错误...(不是完整列表。请参阅 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;
}
我正在尝试制作一个简单的字母替换加密程序,但在加密过程中,它无法正常工作。请告诉我代码有什么问题。下面代码的要点是它要求输入,然后将输入发送到 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;
}
有几个问题
std::string::replace
的第二个参数应该是要替换的字符数,即1
您未能根据
std:string::npos
测试find
结果,因此它将无限循环。 (-1 总是小于字符串长度)W.size()
不是17
.. 或者是?删除杂散的\
或将其转义为\
更多错误...(不是完整列表。请参阅 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;
}