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.
相关产品推荐
相关产品推荐

