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

凯撒移位解密函数在VS Code运行正常但提交至Gradescope无效

凯撒移位解密函数本地正常但Gradescope提交无效的修复

你的代码在本地VS Code运行正常,但提交至Gradescope后失效,最可能的问题是**isalpha的返回值判断逻辑错误**,同时可以优化移位数的处理逻辑,以下是具体排查和修复方案:

核心问题:isalpha的判断逻辑错误

C中<ctype.h>的isalpha函数返回值并非严格的bool类型:它会返回非零值表示当前字符是字母(不同编译器实现可能返回不同非零数,比如GCC中大写字母返回2、小写字母返回1),而true在C中对应数值1。你写的if(isalpha(individual) == true)会在isalpha返回非1的非零值时,错误判定该字符不是字母,导致这些字符无法被解密处理。

修复方法:直接判断isalpha的返回值是否为非零,去掉== true的冗余判断:

if(isalpha(individual))

可选优化:移位数预处理

虽然你的代码通过+26避免了负数取模的问题,但如果测试用例中存在大于26的移位数或负移位数,可以先对移位数做预处理,确保其始终处于0-25的合理区间,减少冗余计算:

rshift = rshift % 26;
if(rshift < 0) rshift += 26;

将这段代码添加到函数开头,让逻辑更健壮。

修改后的完整代码

string decryptCaesar(string ciphertext, int rshift)
{
    string plaintext;
    // 预处理移位数,确保在0-25区间内
    rshift = rshift % 26;
    if(rshift < 0)
        rshift += 26;
    
    int cipher_length = ciphertext.length();
    for(int a = 0; a < cipher_length; a++)
    {
        char individual = ciphertext[a];
        if(isalpha(individual))
        {
            if(individual >= 'A' && individual <= 'Z') // 用字符常量代替魔法数字,可读性更强
            {
                individual = char(((individual - 'A' + 26 - rshift) % 26) + 'A');
            }
            else
            {
                individual = char(((individual - 'a' + 26 - rshift) % 26) + 'a');
            }
        }
        plaintext += individual;
    }
    return plaintext;
}

另外,代码中用'A'、'a'代替65、97这类魔法数字,不仅可读性更强,也避免了字符编码不一致的潜在问题(虽然ASCII是通用标准,但这样写更符合代码规范)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:40:23