You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

额外小优化

  1. 用'a'和'A'替代硬编码的ASCII值97和65,代码更易读且跨平台。
  2. 你的key_char全局变量可以考虑改成局部变量(比如在main里定义后传递给encrypt),减少全局变量的使用是更好的编程习惯。

内容的提问来源于stack exchange,提问作者Dynocoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:27:54