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

C语言单词长度统计直方图程序输出全0问题排查求助

单词长度频率统计程序的问题排查与修复

你的程序输出全为0的问题由以下几个关键错误导致:

1. 未定义的变量引用

在main函数中,调用readTextFile时使用了filename变量,但这个变量从未定义过。正确的做法应该是使用命令行参数传入的文件名,也就是argv[1]。

2. 函数参数类型不匹配

readTextFile函数声明的参数是int bin[]和int freq[],但在main函数中你定义的是float bin[100]和float freq[100],并将这两个浮点数组传递给了需要整数数组的函数。这种类型不匹配会导致数据在传递和写入时出现异常,最终所有的bin和freq值都无法被正确统计。

3. 直方图绘制函数的类型适配问题

原有的printHist、plotHorizontalHist、plotVerticalHist函数接收的是float类型数组,但实际统计的bin和freq都是整数类型,需要在打印时做类型转换,避免类型不兼容导致的输出异常。


修正后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void readTextFile(const char *filename, int bin[], int freq[], int *N);
void printHist(const int bin[], const int freq[], int N);
void plotHorizontalHist(const int bin[], const int freq[], int N);
void plotVerticalHist(const int bin[], const int freq[], int N);

void printHist(const int bin[], const int freq[], int N) {
    for (int i = 0; i < N; i++) {                  // 验证数据
        printf("%.1f %.1f\n", (float)bin[i], (float)freq[i]);
    }
    printf("\n");
}

void plotHorizontalHist(const int bin[], const int freq[], int N) {
    for (int i = 0; i < N; i++) {
        printf("%.1f/%.2f: ", (float)bin[i], (float)freq[i]);

        // 按频率打印*
        for (int j = 0; j < freq[i]; j++) {
            printf("*");
        }

        printf("\n");
    }
    printf("\n");
}

void plotVerticalHist(const int bin[], const int freq[], int N) {
    // 找到最大频率用于缩放竖条
    int maxFreq = 0;
    for (int i = 0; i < N; i++) {
        if (freq[i] > maxFreq) {
            maxFreq = freq[i];
        }
    }

    // 打印垂直直方图
    for (int row = maxFreq; row > 0; row--) {
        for (int i = 0; i < N; i++) {
            if (freq[i] >= row) {
                printf("* ");
            } else {
                printf("  ");
            }
        }
        printf("\n");
    }

    // 打印底部的bin标签
    printf("%.0f", (float)bin[0]);
    for (int i = 1; i < N; i++) {
        printf("%2.0f", (float)bin[i]);
    }
    printf("\n");
}

void readTextFile(const char *filename, int bin[], int freq[], int *N) {
    FILE *f;
    char word[100];

    if ((f = fopen(filename, "r")) != NULL) {
        while (fscanf(f, "%s", word) == 1 && *N < 100) {
            int len = strlen(word);

            // 查找现有bin中是否存在该长度
            int found = 0;
            for (int i = 0; i < *N; i++) {
                if (bin[i] == len) {
                    freq[i]++;
                    found = 1;
                    break;
                }
            }

            // 如果未找到,创建新的bin
            if (!found) {
                bin[*N] = len;
                freq[*N] = 1;
                (*N)++;
            }
        }
        fclose(f);
    } else {
        printf("文件不存在\n");
    }
}

int main(int argc, char **argv) {
    int bin[100];
    int freq[100];
    int N = 0;
    if (argc > 1) {
        readTextFile(argv[1], bin, freq, &N); 
        printHist(bin, freq, N);
        plotHorizontalHist(bin, freq, N);
        plotVerticalHist(bin, freq, N);
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Jacky L.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:33:26