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);删掉,加上三行函数调用,程序就能正常输出正确结果。
可选优化建议
当前用全局变量传递统计结果的写法存在隐患,后续代码复杂时容易出现全局变量被意外修改的问题,更规范的写法是去掉全局变量,用局部变量接收函数返回值:
- 删除全局定义的
float l, w, s; - 在main中调用函数时接收返回值:
int letters = count_letters(text); int words = count_words(text); int sentences = count_sentences(text);
- 调整指数计算逻辑,使用局部变量运算:
float L = 100.0f * letters / words; float S = 100.0f * sentences / words;
- 对应修改三个统计函数,把内部计数改成局部变量,最终return计数结果即可,不需要修改全局值。
补充:当前的单词统计是按空格数+1计算,遇到连续空格、文本首尾带空格的情况会有统计误差,句子统计遇到省略号也会多计数,但CS50的Readability作业测试用例不会涉及这些边界场景,现有逻辑可以通过所有测试点。
内容的提问来源于stack exchange,提问作者omelias
相关产品推荐
相关产品推荐

