换一串字符?

时间:2011-05-30 03:06:34

标签: c++

我正在编写一个用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();
}

复制并粘贴该代码,您就会看到我在说什么。我如何解决这个神秘的问题?

3 个答案:

答案 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)(循环移位)方法轻松实现此目的。