为什么我的凯撒密码会跳过某些字符?
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(" ");
}
还有更好的解决方案,但对于初学者来说应该这样做。
我有下面的代码,凯撒密码在每个输入字符上增加 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(" ");
}
还有更好的解决方案,但对于初学者来说应该这样做。