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

CS50 pset2 Readability题代码输出错误:指定文本无法得到Grade 2结果如何修复

错误原因
  • for循环缺失花括号,逻辑作用域完全错误。for (int i = 0; i < strlen(s); i++)后未加{},导致只有紧随其后的if (isalpha(s[i]))属于循环体,后续所有计数、等级计算、打印逻辑全部被包裹在if (isalpha(s[i]))内部,每遍历到一个字母就会执行一次打印,自然会输出多条年级结果。
  • 计数逻辑嵌套错误。判断空格(单词计数)、判断.!?(句子计数)的代码被放在了if (isalpha(s[i]))的判断分支中,而空格、标点都不属于字母,所以这两个计数器永远不会被触发,统计值完全错误。
  • 冗余判断:已经调用isalpha()判断当前字符是字母的情况下,不需要再额外写一遍大小写字母的范围判断,属于无效代码。
修复后的代码
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

int main(void)
{
    string s = get_string("Text: ");

    int count_letters = 0; // 统计字母数
    int count_words = 1; // 统计单词数,默认初始为1匹配文本首单词
    int count_sentences = 0; // 统计句子数

    // 所有统计逻辑都放在for循环的花括号内
    for (int i = 0, len = strlen(s); i < len; i++)
    {
        if (isalpha(s[i]))
        {
            count_letters++;
        }
        else if (s[i] == ' ')
        {
            count_words++;
        }
        else if (s[i] == '.' || s[i] =='!' || s[i] == '?')
        {
            count_sentences++;
        }
    }

    // 统计完成后再计算 Coleman-Liau 指数,放在循环外部
    float L = (count_letters / (float) count_words) * 100;
    float S = (count_sentences / (float) count_words) * 100;
    int grade = round(0.0588 * L - 0.296 * S - 15.8);
  
    if (grade < 1)
    {
        printf("Before Grade 1\n");
    }
    else if (grade >= 16)
    {
        printf("Grade 16+\n");
    }
    else
    {
        printf("Grade %d\n", grade);
    }
}
修改说明
  1. 给for循环加上了花括号,把所有字符判断的统计逻辑都放在循环体内
  2. 把单词、句子计数的逻辑从isalpha()的分支中挪出来,和字母统计平级
  3. 把等级计算和打印逻辑完全挪到for循环外部,统计完全部字符后再计算输出
  4. 优化了strlen的调用,把长度提前存在变量里避免每次循环都重复计算
  5. 删掉了冗余的字母范围判断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:39:00