【问题标题】:Shifting a string of characters?转移一串字符?
【发布时间】:2011-05-30 16:10:47
【问题描述】:

我正在编写一个用 C++ 解决凯撒密码的程序。它需要一个字母字符串,并在每个循环中将其向左移动:“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();
}

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

【问题讨论】:

  • 可以将temp 变成一个简单的char。 :)

标签: c++


【解决方案1】:

如果我没记错的话,你的循环和下面的代码完全一样:

letters = letters.substr(1,25) + letters.substr(0,1);
//        [skip 1, take 25]    + [first char goes last]

【讨论】:

    【解决方案2】:

    我认为您需要字母为 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 位置凯撒式。

    【讨论】:

    • 这太棒了。由于字母表只有 26 个字符长,那么第 27 个字符会发生什么?
    • 它只是在你破坏它之前保存第一个字符的副本。既然你从不打印出来,这并不重要……但我仍然认为字符本身的算术更清晰。
    【解决方案3】:

    您可以使用valarray&lt; char &gt;::cshift(n)(循环移位)方法轻松实现此目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-29
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 2018-10-20
      • 2017-01-19
      • 2015-01-17
      相关资源
      最近更新 更多