CS50 PSet2 Readability任意输入均输出Before grade 1问题排查
CS50 PSet2 Readability 作业故障排查
问题现象
- 已完成
count_letters、count_words、count_sentences三个计数函数开发,前期验证字母、单词、句子计数返回结果正常,已移除调试阶段使用的计数打印语句 - 年级等级计算输出模块存在异常:无论输入任何文本,程序始终输出“Before grade 1”
- 已自行排查条件打印分支未发现错误,怀疑Coleman-Liau年级指数计算或前置计数逻辑存在问题,多轮自查未定位故障点
根因定位
核心故障出在count_words函数实现,两处问题直接导致单词计数结果远大于真实值,拉低了Coleman-Liau指数计算结果,最终触发index <1的分支:
- 语法错误:
if isspace ((text[i]))写法不符合C语言语法要求,if后的判断条件未用圆括号包裹,会直接导致编译异常或判断逻辑失效 - 计数逻辑错误:每遇到一个空格就执行两次计数加1(
words++和words = words +1等价于连续加2),同时单词计数初始值设为0,既没有考虑“无空格的单单词文本单词数为1”的场景,还会让多单词文本的计数结果达到实际空格数的2倍,和真实单词数偏差极大。
举个实际计算例子:输入8个单词、4个句子、29个字母的低年级文本时,错误的count_words会返回14(7个空格每个加2),代入公式计算得到的指数约为-12,round后远小于1,必然输出“Before grade 1”。
另外之前注释掉的字母ASCII范围判断存在边界漏判问题(缺少等号会漏掉'A'/'Z'/'a'/'z'四个边界字符),不过当前已替换为isalpha实现,该问题已规避。Coleman-Liau指数的计算公式数学逻辑正确,不存在运算顺序错误。
修复方案
- 修正
count_words函数语法,给if判断条件加上外层圆括号 - 调整单词计数逻辑:将初始值设为1(非空输入至少存在1个单词),每遇到1个空格仅给计数加1,删除重复的累加语句。修复后的参考实现:
int count_words(string text) { // 非空文本至少有1个单词 int words = 1; for (int i = 0; i < strlen(text); i++) { if (isspace(text[i])) { words++; } } return words; }
- 修复后可临时加打印语句输出
letters/words/sentences三个值,和手动计数结果比对,确认计数准确后再移除调试打印即可。
内容的提问来源于stack exchange,提问作者user19407769
相关产品推荐
相关产品推荐

