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

CS50 Readability练习main函数调用自定义计数函数问题求解

问题根因

三个自定义统计函数从未被执行,全局变量l(字母数)、w(单词数)、s(句子数)在计算可读性指数时一直是初始值0,参与运算时得到无效数值,最终算出的指数固定为负数,只会触发Before Grade 1的输出分支。另外main函数里int i = strlen(text);这行定义后完全没用到,属于冗余代码可以直接删除。

修复方式

在获取到用户输入的文本之后、计算Coleman-Liau指数之前,依次调用三个统计函数,把输入的文本作为参数传入即可。三个函数执行时会自动遍历文本完成计数,更新全局变量的数值,后续指数计算就能拿到正确的统计结果。
调用代码非常简单,直接写三行:

count_letters(text);
count_words(text);
count_sentences(text);
修正后的完整main函数
int main(void)
{
    // 获取输入文本
    string text = get_string("Text:");

    // 执行统计逻辑
    count_letters(text);
    count_words(text);
    count_sentences(text);

    // 计算Coleman-Liau指数
    float L = 100.0f * (l / (float)w);
    float S = 100.0f * (s / (float)w);
    int index = round(0.0588 * L - 0.296 * S - 15.8);

    // 输出对应等级
    if (index < 1)
    {
        printf("Before Grade 1\n");
    }
    else if (index > 16)
    {
        printf("Grade 16+\n");
    }
    else
    {
        printf("Grade %i\n", index);
    }
}

把原来main里冗余的int i = strlen(text);删掉,加上三行函数调用,程序就能正常输出正确结果。

可选优化建议

当前用全局变量传递统计结果的写法存在隐患,后续代码复杂时容易出现全局变量被意外修改的问题,更规范的写法是去掉全局变量,用局部变量接收函数返回值:

  1. 删除全局定义的float l, w, s;
  2. 在main中调用函数时接收返回值:
int letters = count_letters(text);
int words = count_words(text);
int sentences = count_sentences(text);
  1. 调整指数计算逻辑,使用局部变量运算:
float L = 100.0f * letters / words;
float S = 100.0f * sentences / words;
  1. 对应修改三个统计函数,把内部计数改成局部变量,最终return计数结果即可,不需要修改全局值。

补充:当前的单词统计是按空格数+1计算,遇到连续空格、文本首尾带空格的情况会有统计误差,句子统计遇到省略号也会多计数,但CS50的Readability作业测试用例不会涉及这些边界场景,现有逻辑可以通过所有测试点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:36:14