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; }
错误逻辑导致:
islower接收到的参数永远是key[i3] > 0的布尔值(0或1),这两个值都不属于小写字母ASCII范围,因此判断永远为假,固定走else分支- 当密钥为全大写时,大写字母ASCII值+32刚好对应小写字母ASCII值,结果巧合正确,因此全大写密钥的测试全部通过
- 当密钥包含小写字母时,小写字母ASCII值(97122)+32得到129154,超出标准可打印ASCII范围(0~127),因此触发
output not valid ASCII text报错
另外代码中还存在一个潜在逻辑漏洞:key_check函数仅判断了密钥长度小于26的场景,未判断长度大于26的场景,虽然当前测试用例未触发该问题,但不符合题目要求。
修复方案
- 修正小写映射数组的判断条件括号位置,确保
islower正确接收密钥字符作为参数:
// 修正后代码 if (islower(key[i3]) > 0) { LOWER[i3] = key[i3]; } else { LOWER[i3] = key[i3] + 32; }
- 补全密钥长度校验逻辑,将长度判断从「小于26报错」改为「不等于26报错」:
// 修正后长度校验 if (leng != 26) { printf("Key must contain 26 characters.\n"); return 1; }
修复完成后重新编译运行,所有check50用例即可正常通过。
内容的提问来源于stack exchange,提问作者Gabriel Accetta
相关产品推荐
相关产品推荐

