我正在编写一个用C ++解决Caesar密码的程序。它需要一串字母表并将其转移到每个循环的左侧:“abc .... yz” - > “BCD ..... YZA”。问题是在另一个循环之后:“bcd ..... yza” - > “CDE ..... yzaa”。
char temp; // holds the first character of string
string letters = "abcdefghijklmnopqrstuvwxyz";
while (true)
{
temp = letters[0];
for (int i = 0; i < 26; i++)
{
if (i == 25)
{
letters += temp;
}
letters[i] = letters[i + 1];
cout << letters[i];
}
cin.get();
}
复制并粘贴该代码,您就会看到我在说什么。我如何解决这个神秘的问题?
答案 0 :(得分:5)
如果我没弄错的话,你的循环与下面的代码完全相同:
letters = letters.substr(1,25) + letters.substr(0,1);
// [skip 1, take 25] + [first char goes last]
答案 1 :(得分:4)
我认为你需要27个字符,而不是26个字符,而不是letters += temp
(每次增长字符串),使用letters[26] = temp[0]
。
......此时你可以完全放弃temp
:
string letters = "abcdefghijklmnopqrstuvwxyz.";
while (true)
{
letters[26] = letters[0];
for (int i = 0; i < 26; i++)
{
letters[i] = letters[i + 1];
cout << letters[i];
}
cin.get();
}
[编辑]
虽然处理这个的更自然的方法是对字符本身使用算术。表达式'a' + ((c - 'a' + n) % 26)
会将c
字符n
转移到Caesar风格的地方。
答案 2 :(得分:2)
您可以使用valarray< char >::cshift(n)
(循环移位)方法轻松实现此目的。