【问题标题】:Caesar cipher in C++C ++中的凯撒密码
【发布时间】:2009-02-07 00:26:39
【问题描述】:

首先,我已经学习了四个星期的 C++ 课程,但我什至不知道循环,所以请说婴儿话?

好的,所以我应该从文件中读取 12 个字符串(加上 NULL 为 13 个),然后将字母向后移动三个,然后将我的结果打印到屏幕和文件中。除了移动字母外,我对一切都很好。我不想编写数英里的代码来单独获取每个字符,减去三个,然后重新组合字符串,但我不确定如何一次处理整个字符串。有人可以推荐一个非常简单的方法吗?

【问题讨论】:

  • “我什至还不知道循环”是否意味着您还不能使用它们?
  • 您的意思是像在字符串中重新定位它们一样移动字母还是使用字母表中较早的字符。
  • Amanda:请将答案标记为已接受。有几个不错的答案可供选择。

标签: c++ string encryption


【解决方案1】:

如果您正在处理简单的字母(A 到 Z 或 a 到 z),那么您可以假设内部代码是线性的。

字母编码为数字,介于 0 和 127 之间。A 编码为 65,B 编码为 66,C 编码为 67,Z 编码为 90。

为了移动字母,您只需将内部字母代码更改为数字,因此基本上只需从字符中减去 3。但请注意极端情况,因为将 3 减去 'A' 会得到 '>'(代码 62)而不是 'X'(代码 88)。您可以使用“if”语句或模运算符(“%”)来处理它们。

这里有一个ASCII characters table 来帮助你

【讨论】:

    【解决方案2】:

    加载字符串后,您可以使用模运算符进行旋转,同时保持在 A-Z 空间的范围内。

    我会记录这封信的开头是否是大写:

    bool isCaps = ( letter >= 'A' ) && ( letter <= 'Z' );
    if( isCaps )
      letter -= 'A'-'a';
    

    然后像这样进行密码转换:

    int shift = -3;
    letter -= 'a'; // to make it a number from 0-25
    letter = ( letter + shift + 26 ) % 26;
            // add 26 in case the shift is negative
    letter += 'a'; // back to ascii code
    

    终于结束了

    if( isCaps )
      letter += 'A'-'a';
    

    所以,将所有这些放在一起,我们得到:

    char *mystring; // ciphertext
    int shift = -3; // ciphershift
    
    for( char *letter = mystring; letter; ++letter )
    {
      bool isCaps = ( *letter >= 'A' ) && ( *letter <= 'Z' );
      if( isCaps )
        *letter -= 'A'-'a';
    
      letter -= 'a';
      letter = ( letter + shift + 26 ) % 26;
      letter += 'a';
    
      if( isCaps )
        letter += 'A'-'a';
    }
    

    【讨论】:

      【解决方案3】:

      您将不得不学习循环。它们将允许您在字符串的字符上重复一些代码,这正是您需要的。您将保留一个整数变量,该变量将作为字符串的索引,并在循环内对该索引处的字符进行字母移位,并将索引变量加一,直到达到 NULL。

      编辑:如果您不希望在课程中了解循环,也许他们希望您这样做:

      string[0] -= 3; // this is short for "string[0] = string[0] - 3;"
      string[1] -= 3;
      string[2] -= 3;
      ...
      

      它只会产生 12 行代码而不是英里。您不必以这种方式“重新组装”字符串,您可以就地编辑每个字符。然后我敢打赌,在让你这样做之后,他们会向你展示使用循环的快速方法。

      【讨论】:

        【解决方案4】:

        使用 for 循环遍历字符。用 char* 做你想做的事。然后把新的字符放回去。

        【讨论】:

          【解决方案5】:
          for(int i=0; i<12; i++){
            string[i] = string[i] - 3;
          }
          

          其中 string 是您的字符数组(字符串)。如果您想让它定期进行,则涉及更多内容(即 A 环绕到 Z,但上面的代码应该可以帮助您入门)

          【讨论】:

            【解决方案6】:

            我有点不清楚“将字母向后移动 3”是什么意思? 这是否意味着 D ==> A?
            如果是这样,这是一个简单的循环。

            (我没有从文件中读取或写入文件……那是你的部分)

            #include <string.h>
            
            int main(void)
            {                      
                char input[13] = "ABCDEFGHIJKL";
                int i;
            
                int len = strlen(input);
            
                for(i=0; i<len; ++i)
                {
                    input[i] = input[i]-3;
                }
            
                printf("%s", input);  // OUTPUT is: ">?@ABCDEFGHI"
            }
            

            【讨论】:

            • WTF 被否决了?我认为我的回答非常明确和直截了当。
            • 我没有对你投反对票,但我猜这是因为你提供了代码而不是解释 如何 来解决问题,这对某人来说并不是那么有益开始学习了。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-07
            • 1970-01-01
            相关资源
            最近更新 更多