CS50 PSET2 Readability程序仅输出Before Grade 1问题求助
CS50 PSET2 Readability 始终输出'Before Grade 1'问题定位
你的代码核心问题是没调用统计函数就直接计算阅读指数,导致用来计算L和S的变量都是初始值,最终算出的指数必然小于1,所以一直输出Before Grade 1。具体问题拆解:
- 你在
main函数里拿到用户输入的text后,直接用letters、words、sentences计算L和S,但这三个变量根本没经过统计函数赋值——你写了count_letters、count_words、count_sentences三个函数,但从头到尾没调用过它们! - 另外你重复定义了全局变量:顶部声明了
int letters; int sentences; int words;,又在每个函数外重新定义了带初始值的同名变量,这会导致变量作用域混乱,而且全局变量本身容易引发这类未初始化/未更新的问题,更推荐用局部变量接收函数返回值。
修正后的代码
#include <cs50.h> #include <stdio.h> #include <ctype.h> #include <math.h> #include <string.h> // 函数声明 int count_sentences(string); int count_words(string); int count_letters(string); int main(void) { // 获取用户输入 string text = get_string("Text: "); // 调用统计函数,用局部变量接收结果 int letters = count_letters(text); int words = count_words(text); int sentences = count_sentences(text); // 计算阅读等级 float L = 100.0 * letters / words; float S = 100.0 * sentences / words; 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); } } // 统计字母数量 int count_letters(string text) { int letters = 0; // 用局部变量,避免全局副作用 for (int i = 0; i < strlen(text); i++) { if (isalpha(text[i])) { letters++; } } return letters; } // 统计单词数量 int count_words(string text) { int words = 1; for (int i = 0; i < strlen(text); i++) // 从0开始循环,避免漏掉开头空格导致的单词统计错误 { if (isspace(text[i])) { words++; } } return words; } // 统计句子数量 int count_sentences(string text) { int sentences = 0; for (int i = 0; i < strlen(text); i++) { if (text[i] == '.' || text[i] == '!' || text[i] == '?') { sentences++; } } return sentences; }
额外修正点说明
- 去掉了所有全局变量,改用函数内的局部变量统计,避免全局变量带来的未初始化/重复定义问题
count_words函数的循环从i=0开始,避免漏掉文本开头的空格(如果用户输入开头有空格的话,原来的i=1会少统计一个单词)- 计算
L和S时用100.0而不是100,确保浮点数运算更准确
内容的提问来源于stack exchange,提问作者Gabriela
相关产品推荐
相关产品推荐

