为什么我的凯撒密码会跳过某些字符?

Why Is My Caesar Cipher Code Skipping Over Some Characters?

我有下面的代码,凯撒密码在每个输入字符上增加 13 个字符。它适用于几乎所有输入,但似乎会跳过随机字符。我似乎无法弄清楚为什么?我还在学习,所以任何帮助都会很棒!

输入的是编码后的字符串,输出时每个字符向前移动13位。预期的输出应该是一个可读的字符串。

如果我输入 rot13('GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT.') 我会期望 'THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.' 但是我得到 'T H E Q U I C K B R O W N F B X J H M P S B V R E G U R L A Z Y D B G .'

我知道这可能是重复的,但到目前为止我找不到这个特定问题的答案。

function rot13(str) {
  
  let newStr = [];

  for (let i = 0; i < str.length; i++) {
    let charNum = str.charCodeAt(i);
    console.log(charNum);
    if (charNum > 64 && charNum < 78) {
      let res = str.replace(str[i], String.fromCharCode(charNum + 13));
      newStr.push(res[i]);
    } else if (charNum > 77 && charNum < 91) {
      let res = str.replace(str[i], String.fromCharCode(charNum - 13));
      newStr.push(res[i]);
    } else {
      newStr.push(str[i]);
    }
  }

  console.log(newStr);
  return newStr.join(" ");
}

rot13('GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT.');

String.fromCharCode(charNum + 13) & String.fromCharCode(charNum - 13) 就是你所需要的。您不需要替换 str.

中索引 i 处的字符
newStr.push(String.fromCharCode(charNum + 13));
newStr.push(String.fromCharCode(charNum - 13));

问题出在你的第二种情况:

let res = str.replace(str[i], String.fromCharCode(charNum - 13));

但即使没有它,您的代码也设计过度了。稍微修改的版本

function rot13(str) {
  let newStr = [];

  for (let i = 0; i < str.length; i++) {
    let charNum = str.charCodeAt(i);
    //console.log(charNum);
    if (charNum > 64 && charNum < 78) {
      let res = String.fromCharCode(charNum + 13);
      newStr.push(res);
    } else if (charNum > 77 && charNum < 91) {
      let t = charNum + 13 - "Z".charCodeAt(0);
      let res = String.fromCharCode("A".charCodeAt(0) - 1 + t);
      newStr.push(res);
    } else {
      newStr.push(str[i]);
    }
  }

  return newStr.join(" ");
}

还有更好的解决方案,但对于初学者来说应该这样做。