我之前有一个类似的问题,并设法解决了。现在,我尝试向后进行操作,这是当前的代码。
基本上我希望最终结果为“ p5A5SSW5o5R5o5d”,但是运行此程序时,它只是找到passworod的第一部分中的第一个“ o”,我需要它跳过已经添加了5的元音之前和之后。
我希望每个元音(在当前字符串中仅包含AOao,因为这就是我的字符串中出现的所有元音)的前缀和后缀为5。它卡在第一个o处,并且不会继续到下一个o。我创建了一个嵌套的for循环,这意味着它将获取加密字符串中的第一个字符,进入下一个for循环,并遍历元音字符串中包含的每个单个元音Ive直到找到匹配项。否则,它将在第一个for循环处重新启动,但增加一个。首先,它应该搜索字母“ p”,其次,它应该搜索字母“ A”,依此类推。
结果:p 5 A 5 SSW 55 o 55 杆
预期结果:p 5 A 5 SSW 5 o 5 R 5 o 5 d
最后,我还要旋转所有字符,但这就是另一项任务,我想我可以只使用if语句或开关来做到这一点。如果它以5结尾,则什么也不做,否则旋转。
希望我能清楚自己,并向您提供所有相关信息,否则请在评论中保持警惕。
谢谢。
#include <string>
#include <sstream>
const string vowel = "AOao";
string encrypt, decrypt;
encrypt = "pASSWoRod";
decrypt = encrypt;
for (int i=0; i<encrypt.length(); i++){
for (int j=0; j<vowel.length(); j++){
if (encrypt[i] == vowel[j]){
decrypt.insert(decrypt.find(vowel[j]), 1, '5');
decrypt.insert(decrypt.find(vowel[j]) + 1, +1, '5');
}
}
}
return decrypt;
}
答案 0 :(得分:3)
find
在未被证明是起点的情况下,始终会找到第一个实例。
搜索并跟踪字符串的长度以及您已经在其中插入字符的位置比乍一看要困难得多(如您所注意到的那样)。
从头开始构建结果,而不是在初始字符串中插入字符。
还要实现此功能(实际实现留作练习):
bool is_vowel(char c);
然后
std::string encrypt = "pASSWoRod";
std::string decrypt;
for (auto c: encrypt)
{
if (is_vowel(c))
{
decrypt += '5';
decrypt += c;
decrypt += '5';
}
else
{
decrypt += c;
}
}
答案 1 :(得分:0)
您的find
在元音的第一个实例“ o”处停止。您应该为查找添加一个起始位置,以便忽略已分析的解密字符串部分。
答案 2 :(得分:0)
find
从头开始。您将需要另一个find。
但是在解密中维护索引后,不再需要查找。
int encryptI = 0;
for (int i = 0; i < decrypt.length(); i++, encyptI++){
for (int j=0; j<vowel.length(); j++){
if (decrypt[i] == vowel[j]){
//encryptI = encrypt.find(vowel[j], encryptI);
encrypt.insert(encryptI, 1, '5');
encrypt.insert(encryptI + 1, +1, '5');
encryptI += 2;
break;
}
}
}
代码可能会更好。
string encrypt;
for (int i = 0; i < decrypt.length(); i++, decyptI++){
char ch = decrypt[i];
if (vowel.find(ch) != string::npos) {
encrypt.append('5');
encrypt.append(ch);
encrypt.append('5');
} else {
encrypt.append(ch);
}
}