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

代码可编译但输出-nan,可读性计算功能异常求助

问题解决:代码输出-nan的原因及修复方案

为什么会出现-nan?

NaN(Not a Number)是无效数值计算的结果,你的代码里出现*-nan*,核心原因是使用未初始化的变量做除法运算,或运算过程中出现除以0的情况。

你的代码存在的问题

  1. 全局变量未初始化:你定义的words、letters、sentences都是全局变量,默认会被赋予随机垃圾值,且这些变量未被计算函数赋值就直接参与compute_Readability里的除法运算。
  2. 函数调用顺序错误:你在main里先调用了compute_Readability,但此时计算字母、单词、句子的函数还没执行,导致参与运算的变量都是垃圾值。
  3. 全局变量滥用:全局变量容易引发这类未初始化问题,也不利于代码逻辑的清晰性。

修复后的代码

#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>

int compute_Letters(string Text);
int compute_words(string Text);
int compute_sentences(string Text);
float compute_Readability(int letters, int words, int sentences);

int main(void)
{
    string Text = get_string("Text: ");
    
    // 先计算文本的字母、单词、句子数量
    int letters = compute_Letters(Text);
    int words = compute_words(Text);
    int sentences = compute_sentences(Text);
    
    // 基于计算出的数值得到阅读等级
    float Grade = compute_Readability(letters, words, sentences);
    
    // 按规则输出结果
    if (Grade < 1)
    {
        printf("Before Grade 1\n");
    }
    else if (Grade > 16)
    {
        printf("Grade 16+\n");
    }
    else
    {
        printf("Grade: %.0f\n", round(Grade));
    }
}

int compute_Letters(string Text)
{
    int count = 0;
    for (int i = 0, len = strlen(Text); i < len; i++)
    {
        if (isalpha(Text[i]))
        {
            count++;
        }
    }
    return count;
}

int compute_words(string Text)
{
    int count = 1; // 文本至少包含一个单词
    for (int i = 0, len = strlen(Text); i < len; i++)
    {
        if (isblank(Text[i]))
        {
            count++;
        }
    }
    return count;
}

int compute_sentences(string Text)
{
    int count = 0;
    for (int i = 0, len = strlen(Text); i < len; i++)
    {
        if(Text[i] == '.' || Text[i] == '?' || Text[i] == '!')
        {
            count++;
        }
    }
    return count;
}

float compute_Readability(int letters, int words, int sentences)
{
    // 强制转换为float避免整数除法精度丢失
    float avgletters = (float)letters / words * 100;
    float avgsentences = (float)sentences / words * 100;
    return 0.0588 * avgletters - 0.296 * avgsentences - 15.8;
}

关键修改点

  • 移除全局变量,改用局部变量,每个计算函数内部初始化计数器,彻底避免垃圾值干扰
  • 调整调用顺序:先计算字母、单词、句子数,再计算阅读等级
  • 修改compute_Readability的参数逻辑,直接传入已计算好的数值,逻辑更清晰
  • 修复整数除法问题:将int类型的计数强制转为float后再做除法,避免精度丢失
  • 规范代码格式,添加必要的大括号,防止逻辑歧义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:24:57