c - C文件中最常见的字符

标签 c file character

我正在做我的 C 编程类(class)作业,我需要在给定文件中找到最常见的字符。

我用测试文件、空文件和其他少量文本文件进行的测试效果很好(或者至少我是这么认为的),但是在最后一个长测试文件中出了点问题,错误消息是:“应该返回 ' e' (101) 用于文件 rfc791.txt。您返回了 'b' (98)"

那么我想问的是,当最常见的字母突然不应该是什么时,我的代码可能出了什么问题?

int most_common_character(char *filename) {
    FILE *f;
    if ((f = fopen(filename, "r")) == NULL) {
        fprintf(stderr, "Not opened: %s\n", strerror(errno));
        return -1;
    }

    char frequency[26];
    int ch = fgetc(f);
    if (ch == EOF) {
        return 0;
    }

    for (ch = 0; ch < 26; ch++) {
        frequency[ch] = 0;
    }

    while (1) {
        ch = fgetc(f);
        if (ch == EOF) {
            break;
        }
        if ('a' <= ch && ch <= 'z') {
            frequency[ch - 'a']++;
        }
        else if ('A' <= ch && ch <= 'Z') {
            frequency[ch - 'A']++;
        }
    }
    int maxCount = 0;
    int maxChar = 0;
    for (int i = 0; i <= 26; ++i) {
        if (frequency[i] > maxCount) {
            maxCount = frequency[i];
            maxChar = i;
        }
    }
    fclose(f);
    return maxChar + 'a';
}

如果有人有任何提示来修复我的代码,我将不胜感激 :) 我已尝试从许多其他相关主题中搜索此问题的解决方案,但似乎没有任何效果。

最佳答案

您应该在第二个 for 循环中使用 < 运算符。因此,当您检查 frequency[i] > maxCount 时,在 frequency[26] 处它表现出未定义的行为,这意味着该索引处的值可能小于或大于比较值。

关于c - C文件中最常见的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39743770/

相关文章:

c++ - 将数据实时写入文件或在程序关闭时写入文件更好吗?

java 计算文件中的行数并能够稍后读取它们

c - 为什么我的 File.dat 不会被读取和运行,我如何将数据分配给结构? - C

Java String 到一种类型的字符

c - 为什么 strcpy 会触发全局变量的段错误?

带 fork 和管道的 C 程序

c++ - 函数声明中的最大参数个数

c - 指向返回多维数组的函数的函数指针

wpf - 如何在 wpf 中文本 block 的开头添加 CharacterEllipsis?

C - 在内存被释放()之后访问数据?