【问题标题】:Having trouble with my code involving rot-13 [closed]我的涉及 rot-13 的代码遇到问题 [关闭]
【发布时间】:2013-05-15 23:57:42
【问题描述】:

我必须编写一个程序,它基本上会返回一个向前或向后 13 位的字符。它仅适用于字母表中的字符,如果是小写,则保持小写,如果是大写,则保持大写。

    char char_rot_13(char c);

到目前为止,我已经做了两个条件语句,一个用于小写字符,一个用于从 a 到 z 的大写字符。然后我返回,在每一个中,new_character = c + 13。但是当我尝试一个带有'W'的测试用例时,测试失败了。

char char_rot_13(char c)
{
   char new_c;
   if (c >= 'a' && c <= 'z')
   {
      new_c = c + 13;
   }
   else if (c >= 'A' && c <= 'Z')
   {
      new_c = c + 13;
   }
   return new_c;
}

【问题讨论】:

  • 我理解你想要做什么,但是,有一个异常:你将返回一个不是字母表中的字母的字符。你能试着用'z'测试一下,看看我的意思吗
  • 当您将一个值添加到c 并将其发送到“Z”之后,计算机不知道“环绕”。 W + 13 = 'd' in ASCII 但你想要的是'J'。如何让它环绕,以便从“A”开始计数是你必须弄清楚的。
  • @Adeeb:我明白你的意思,当我测试它时,它告诉我预期的结果是“?”。那么要解决这个问题,我将如何排除那些不是字母的特殊字符?
  • @MattPhillips:我明白你的意思,所以,为了避免回绕,我是否必须确定何时减去 13 个位置而不是添加 13 个位置?
  • 是的,在这种情况下可以这样做,因为方便的是 26/13 = 2。对于一般情况,您需要使用 %(模数)。

标签: c character uppercase lowercase rot13


【解决方案1】:

问题出在这里

new_c = c + 13;

ROT-13 是 rotation 而不仅仅是 addition

例如,rot13('a') 应该是 'a'+13, 但rot13('W') 应该是 'W'-13 而不是 'W'+13。

【讨论】:

    【解决方案2】:

    一个优雅的解决方案是将字母转换为数字 [0-25] 并使用加法和模运算。查阅 ascii 代码可能会有所帮助,但可以直接使用 'a' 和 'A' 的值来完成。

    【讨论】:

    • 我不能使用字符的整数值。 :(
    【解决方案3】:

    也许

    char char_rot_13(char c){
       char new_c;
       if (c >= 'a' && c <= 'z')
       {
          new_c = c + 13;
          if(new_c > 'z')
              new_c -= 26;
       }
       else if (c >= 'A' && c <= 'Z')
       {
          new_c = c + 13;
          if(new_c > 'Z')
              new_c -= 26;
       }
       return new_c;
    }
    

    【讨论】:

    • 感谢您的帮助!我想我明白了!