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

CS50 Pset2 Substitution check50报output not valid ASCII text错误

CS50 Pset2 Substitution 题目check50检测失败问题修复

问题现象

程序本地运行输出看似符合预期,但check50检测存在2个失败用例,核心异常特征:

  • 使用全大写密钥时,所有加密测试正常通过
  • 使用全小写密钥、大小写混合密钥加密时,报错output not valid ASCII text

完整check50检测结果:

:) substitution.c exists
:) substitution.c compiles
:) encrypts "A" as "Z" using ZYXWVUTSRQPONMLKJIHGFEDCBA as key
:) encrypts "a" as "z" using ZYXWVUTSRQPONMLKJIHGFEDCBA as key
:) encrypts "ABC" as "NJQ" using NJQSUYBRXMOPFTHZVAWCGILKED as key
:) encrypts "XyZ" as "KeD" using NJQSUYBRXMOPFTHZVAWCGILKED as key
:) encrypts "This is CS50" as "Cbah ah KH50" using YUKFRNLBAVMWZTEOGXHCIPJSQD as key
:( encrypts "This is CS50" as "Cbah ah KH50" using yukfrnlbavmwzteogxhcipjsqd as key
    output not valid ASCII text
:( encrypts "This is CS50" as "Cbah ah KH50" using YUKFRNLBAVMWZteogxhcipjsqd as key
    output not valid ASCII text
:) encrypts all alphabetic characters using DWUSXNPQKEGCZFJBTLYROHIAVM as key
:) does not encrypt non-alphabetical characters using DWUSXNPQKEGCZFJBTLYROHIAVM as key
:) handles lack of key
:) handles too many arguments
:) handles invalid key length
:) handles invalid characters in key
:) handles duplicate characters in key
:) handles multiple duplicate characters in key

根因分析

核心bug出在subs函数生成小写密钥映射数组的逻辑中,括号位置书写错误:

// 错误代码:括号位置错误,将key[i3] > 0的布尔结果传给了islower
if (islower(key[i3] > 0)) {
    LOWER[i3] = key[i3];
}
else {
    LOWER[i3] = key[i3] + 32;
}

错误逻辑导致:

  1. islower接收到的参数永远是key[i3] > 0的布尔值(0或1),这两个值都不属于小写字母ASCII范围,因此判断永远为假,固定走else分支
  2. 当密钥为全大写时,大写字母ASCII值+32刚好对应小写字母ASCII值,结果巧合正确,因此全大写密钥的测试全部通过
  3. 当密钥包含小写字母时,小写字母ASCII值(97122)+32得到129154,超出标准可打印ASCII范围(0~127),因此触发output not valid ASCII text报错

另外代码中还存在一个潜在逻辑漏洞:key_check函数仅判断了密钥长度小于26的场景,未判断长度大于26的场景,虽然当前测试用例未触发该问题,但不符合题目要求。

修复方案

  1. 修正小写映射数组的判断条件括号位置,确保islower正确接收密钥字符作为参数:
// 修正后代码
if (islower(key[i3]) > 0) {
    LOWER[i3] = key[i3];
}
else {
    LOWER[i3] = key[i3] + 32;
}
  1. 补全密钥长度校验逻辑,将长度判断从「小于26报错」改为「不等于26报错」:
// 修正后长度校验
if (leng != 26) {
    printf("Key must contain 26 characters.\n");
    return 1;
}

修复完成后重新编译运行,所有check50用例即可正常通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:06:37