我正在开发一个用某个密钥解密文本的程序。我正在尝试使用replace()
但它似乎没有用。例如,qwert
应解密为hello
,但输出为hlllo
;在这种情况下,w
中的qwert
会被解密为e
,但会重新解密为l
。
输入:
xnm ceuob lrtzv ita hegfd tsmr xnm ypwq ktj
should come out as:
the quick brown fox jumps over the lazy dog
I'm getting:
oga yaacd brozn aox gamav ovar oga lazy dog
我该如何解决这个问题?
int main()
{
// ...
myFile.open("decrypt.txt");
while (myFile.good())
{
getline(myFile, line2);
// now line2 is, e.g., "xnm ceuob lrtzv ita hegfd tsmr xnm ypwq ktj"
// help here
for (int i = 0; i < 26; i++)
{
replace(line2.begin(), line2.end(), key[i], fox[i]);
}
v.push_back(line2);
}
myFile.close();
for (int i = 0; i < numline; i++)
{
cout << "line " << i <<" = " << v[i] << endl;
}
return 0;
}
答案 0 :(得分:2)
通过进行26次单独的替换,后者将踩到早期的替换结果。您需要找到一种方法,使每个替换每个字符只发生一次。
答案 1 :(得分:1)
您需要解密每个角色一次。您可以考虑在输入字符及其解密版本之间构建map,而不是有两个数组key
和fox
,其中(显然)包含要替换的字符。然后你可以简单地遍历输入字符串,一次解密一个字符。
std::map<char, char> lookup;
// populate lookup such that lookup['q'] = 'h', lookup['w'] = 'e', etc.
// walk over line2, decrypting a character at a time.
for (int i = 0; i < line2.length(); i++)
{
char c = line2[i];
char d = lookup[c];
line2[i] = d;
// or, if you want to keep it on one line:
// line2[i] = lookup[line2[i]];
}
答案 2 :(得分:-1)
在C ++中,您可以使用方括号访问和修改字符串元素。例如:
String str("dog");
str[1] = 'c';
//str = "dcg"
因此,您可以使用此表示法而不是replace()
。如果替换不能按照您的意图工作,那么您的密钥可能就错了。