JavaScript实现凯撒密码遇空格/特殊字符异常的问题求助
凯撒密码加解密问题修复方案
现有代码的核心问题
- 循环内重复重置
newString = [],导致每次迭代都清空之前的结果,最终只剩最后一次操作的无效内容 - 判断条件错误:
alphabet.includes(plainMessage)是检查整个输入字符串是否在字母数组中,永远返回false,应该检查当前遍历的单个字符plainMessage[i] - 数组操作逻辑混乱:
newString += [i]这种写法会把数组强制转成字符串拼接,完全不符合收集加密字符的需求 encryptLetter函数未处理非字母字符:当输入空格、数字或特殊字符时,alphabet.indexOf()返回-1,计算出的newIndex会导致错误的字母映射(比如空格会被错误映射到c)
改进后的实现(基于你熟悉的数组方法,无需charCode)
我们保留你用字母数组的思路,只修正核心逻辑,同时完美处理非字母字符:
const shift = 3; const alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; const plainMessage = 'Where will the party take place in 2024?'; // 加密单个字符的函数,新增非字母处理逻辑 function encryptChar(char, shift) { // 标记原字符是否为小写 const isLowerCase = alphabet.includes(char); // 统一转小写找索引 const lowerChar = char.toLowerCase(); const index = alphabet.indexOf(lowerChar); // 如果不是字母(index为-1),直接返回原字符 if (index === -1) { return char; } // 计算新索引,取模避免超出数组长度(比如z+3会回到c) const alphabetLength = alphabet.length; const newIndex = (index + shift) % alphabetLength; const newLowerChar = alphabet[newIndex]; // 恢复原字符的大小写 return isLowerCase ? newLowerChar : newLowerChar.toUpperCase(); } // 加密整个字符串的函数 function encryptMessage(message, shift) { const encryptedChars = []; // 逐个遍历字符串中的字符 for (let i = 0; i < message.length; i++) { const currentChar = message[i]; // 调用加密函数,把结果存入数组 encryptedChars.push(encryptChar(currentChar, shift)); } // 把数组拼接成最终的加密字符串 return encryptedChars.join(''); } // 执行加密并输出结果 const encryptedMessage = encryptMessage(plainMessage, shift); console.log('加密后的消息:', encryptedMessage);
关键改进点说明
- 保留非字母字符:遇到空格、数字、特殊字符时直接返回原内容,不会错误映射为字母
- 正确遍历单个字符:循环中每次处理
message[i],而非操作整个字符串 - 数组正确收集结果:用
push()添加加密后的字符,最后用join('')转成字符串,避免拼接错误 - 处理大小写:记录原字符的大小写状态,加密后恢复,保证大写字母加密后仍为大写
测试结果
输入'Where will the party take place in 2024?'会输出:'Zkhuh zloo wkh sduwb wdnh sodfh lq 2024?'
内容的提问来源于stack exchange,提问作者Brice N
相关产品推荐
相关产品推荐

