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); } }
修改说明
- 给for循环加上了花括号,把所有字符判断的统计逻辑都放在循环体内
- 把单词、句子计数的逻辑从
isalpha()的分支中挪出来,和字母统计平级 - 把等级计算和打印逻辑完全挪到for循环外部,统计完全部字符后再计算输出
- 优化了strlen的调用,把长度提前存在变量里避免每次循环都重复计算
- 删掉了冗余的字母范围判断
内容的提问来源于stack exchange,提问作者123supreme
相关产品推荐
相关产品推荐

