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

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的分支:

  1. 语法错误:if isspace ((text[i])) 写法不符合C语言语法要求,if后的判断条件未用圆括号包裹,会直接导致编译异常或判断逻辑失效
  2. 计数逻辑错误:每遇到一个空格就执行两次计数加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指数的计算公式数学逻辑正确,不存在运算顺序错误。

修复方案

  1. 修正count_words函数语法,给if判断条件加上外层圆括号
  2. 调整单词计数逻辑:将初始值设为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;
}
  1. 修复后可临时加打印语句输出letters/words/sentences三个值,和手动计数结果比对,确认计数准确后再移除调试打印即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:03:23