JavaScript凯撒加密代码触发无限循环导致系统过载无响应问题求助
凯撒加密代码问题修复
已定位的错误点
- 直接导致卡死的死循环诱因:数组赋值逻辑错误
原代码中tTexteAvant = new Array(texteBase.split(''));写法错误,split('')执行后已经返回拆分好的一维字符数组,外层套new Array()会生成二维数组,后续循环传入加密函数的参数是整个字符数组而非单个字符,永远无法匹配字母表触发无限循环。 - 加密函数的死循环隐患:
原crypter函数中匹配字符的while循环没有边界判断,只要传入的内容不在字母表数组中(比如小写字母、数字、特殊符号),i会无限自增导致程序过载卡死。 - 其他功能错误:
- 加密函数最终返回的是索引值而非对应的加密字符,不符合功能要求
- 移位边界判断逻辑错误,未覆盖
i + nC刚好等于字母表长度的场景 - 未兼容用户输入的小写字母,会直接匹配失败触发死循环
修复后完整代码
function crypter(t, l, nC) { // 统一转大写匹配字母表 l = l.toUpperCase(); // 用indexOf替代手动循环避免死循环 let i = t.indexOf(l); // 不在字母表的字符直接返回原字符避免报错 if (i === -1) return l; // 用模运算简化移位计算,自动处理边界 const targetIndex = (i + nC) % t.length; return t[targetIndex]; } //Global variables var tAlphaB = ['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', ' ' ]; var niveauCryptage = 0; var texteBase = ''; var tTexteAvant = new Array(); var tTexteApres = []; var txt = 'Le résultat du cryptage est : \n\n'; //Main program //Ask the user to specify the number by which the letters of the message have to be shifted in the alphabet //This number has to be a number between 1 and 10 (1 and 10 included) do { niveauCryptage = parseFloat(prompt("Saisissez un nombre entre 1 et 10 pour selectionner le niveau de cryptage")); } while (isNaN(niveauCryptage) || niveauCryptage > 10 || niveauCryptage < 1) //Ask the user to enter a message on the condition that it is a chain of characters do { texteBase = prompt("Quel texte voudrez-vous crypter?"); } while (!isNaN(texteBase)) // 修正数组赋值,直接取split返回的一维数组 tTexteAvant = texteBase.split(''); //Encrypt each letter of the table, tTexteAvant, into a new table, tTexteApres var j = 0; while (j < tTexteAvant.length) { tTexteApres.push(crypter(tAlphaB, tTexteAvant[j], niveauCryptage)); j++; } // 输出加密结果 alert(txt + tTexteApres.join('')); console.log(txt + tTexteApres.join(''));
内容的提问来源于stack exchange,提问作者LimeeFox
相关产品推荐
相关产品推荐

