【问题标题】:strange wrong char's encryption (ascii)奇怪的错误字符加密(ascii)
【发布时间】:2016-04-01 19:45:04
【问题描述】:

这是一个简单的代码,但我无法理解一个奇怪的事件。 代码:

void Crittografia::CifraTesto(char text[]){
    int i;
    for (i=0;i<strlen(text);i++){
        text[i]=text[i] + key;
        if(text[i] > 'z'){
            text[i]=text[i] - 26;
        }
    }
}

函数接收此处输入的字符串: It works.
在这种情况下,它与 5 的键一起使用。“y”正确地更改为“d”。

但在这种情况下:Doesn't work.
键为 7 时,它会更改 'Ç' 中的 'y' 而不是正确的 'f',因此显然不会执行该行:“text[i]=text[i] - 26;”

【问题讨论】:

  • 您需要学习如何从控制台窗口复制文本。在 Windows 操作系统上,右键单击标题栏,选择“编辑”->“标记”。用鼠标突出显示要复制的区域,然后按 Enter。这会将突出显示的文本放置到剪贴板上,以便将其粘贴到您的问题中。
  • ASCII table reference 可能是一个好的开始。然后你可能知道为什么,例如someCharacteer - 26 可能不是一个好主意。
  • C 中没有::,所以你的问题也不是C

标签: c++ encryption ascii


【解决方案1】:

文本[i]=文本[i] + 键;

当键为 7 且 text[i]'y' 时,添加结果不适合 char(似乎您的 char 已签名)并且结果由实现定义。

你最好在加法中使用模运算符。例如

text[i]= (text[i] - 'a' + key) % 26 + 'a';

【讨论】:

    【解决方案2】:

    正如 Giorgi 所说,您的问题在于溢出。您可以通过从不等式两边减去key 来避免它:

    for (int i=0; text[i]; i++) {
        if (text[i] > 'z' - key) // check whether (text[i] + key) would be past `z`
            text[i] -= 26 - key;
        else
            text[i] += key;
    }
    

    【讨论】:

      【解决方案3】:

      您需要使用 modulus 运算符,'%'。
      在 StackOverflow 中搜索“c++ caesar cipher”以获取此分配的更多示例。

      例子:

      new_letter = (old_letter - 'a'); // Set the range from 0 to 25.
      new_letter = (new_letter + key) % 26; // 26 letters in the alphabet.
      new_letter += 'a'; // Convert back to a letter.
      

      【讨论】:

      • 模数很有用,但不是必需的。此外,无需使用% 即可计算模数。
      • @BenVoigt 但是我们都使用模数,OP 会在其他人的代码中看到它。
      猜你喜欢
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多