CS50 Pset2 Substitution程序异常:特定密钥下字母'o'与'z'加密失效
问题分析与修复
你遇到的问题根源非常清晰——你的encrypt函数里写错了判断条件!
核心错误
在encrypt的循环中,你判断的是密钥的第i个字符key[i]是否为字母,而不是明文的第i个字符input[i]:
// 错误:判断的是key[i],不是input[i] if ((key[i] >= 65 && key[i] <= 90) || (key[i] >= 97 && key[i] <= 122)) {
为什么这个错误会在特定密钥下触发?
你的明文长度("The quick brown fox jumps over the lazy dog")超过了26个字符。当循环索引i大于等于26时,key[i]会越界访问内存(因为密钥只有26个字符),此时读取到的是不确定的垃圾值。
恰好当i对应到明文中的'o'(比如i=26)和'z'(i=37)时,越界读取到的垃圾值不是字母,导致条件不成立,直接跳过了加密逻辑。而其他密钥可能在越界位置恰好读取到了字母(纯属巧合),所以没有暴露这个问题。
修复后的代码
把判断条件改成检查input[i]是否为字母,同时推荐用isalpha()函数替代手动的ASCII范围判断(更简洁且可读性更高):
string encrypt(string key, string input) { string output = input; int index; for (int i = 0, n = strlen(input); i < n; i++) { // 修正:判断明文当前字符是否为字母 if (isalpha(input[i])) { if (islower(input[i])) { index = input[i] - 'a'; output[i] = tolower(key_char[index]); } else if (isupper(input[i])) { index = input[i] - 'A'; output[i] = toupper(key_char[index]); } } // 非字母字符直接保留,无需处理 } return output; }
额外小优化
- 用
'a'和'A'替代硬编码的ASCII值97和65,代码更易读且跨平台。 - 你的
key_char全局变量可以考虑改成局部变量(比如在main里定义后传递给encrypt),减少全局变量的使用是更好的编程习惯。
内容的提问来源于stack exchange,提问作者Dynocoder
相关产品推荐
相关产品推荐

