C程序计算文本文件中的词频

标签 c word-count

我需要能够用 C 编程编写代码来读取文本文件,找出每个单词有多少个,并输出该单词及其出现的次数。现在我有代码可以打印出每个单词及其出现的次数,但我需要它按字母顺序打印并忽略大写字母。例如,“It”和“it”应该算作同一个词。我不确定在我的代码中的哪个位置包含修订。下面是我的代码示例。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    if (argc == 1) {
        printf("The input file name has not been provided\n");
    } else if (argc == 2) {
        FILE *f = fopen(argv[1], "rb");
        fseek(f, 0, SEEK_END);
        long fsize = ftell(f);
        fseek(f, 0, SEEK_SET);

        char *str = malloc(fsize + 1);
        fread(str, fsize, 1, f);
        fclose(f);

        str[fsize] = 0;
        int count = 0, c = 0, i, j = 0, k, space = 0;
        char p[1000][512], str1[512], ptr1[1000][512];
        char *ptr;
        for (i = 0; i < strlen(str); i++) {
            if ((str[i] == ' ') || (str[i] == ',') || (str[i] == '.')) {
                space++;
            }
        }
        for (i = 0, j = 0, k = 0; j < strlen(str); j++) {
            if ((str[j] == ' ') || (str[j] == 44) || (str[j] == 46)) {
                p[i][k] = '\0';
                i++;
                k = 0;
            } else
                p[i][k++] = str[j];
        }
        k = 0;
        for (i = 0; i <= space; i++) {
            for (j = 0; j <= space; j++) {
                if (i == j) {
                    strcpy(ptr1[k], p[i]);
                    k++;
                    count++;
                    break;
                } else {
                    if (strcmp(ptr1[j], p[i]) != 0)
                        continue;
                    else
                        break;
                }
            }
        }
        for (i = 0; i < count; i++) {
            for (j = 0; j <= space; j++) {
                if (strcmp(ptr1[i], p[j]) == 0)
                    c++;
            }
            printf("%s %d \n", ptr1[i], c);
            c = 0;
        }
    }
    return 0;
}

最佳答案

这是一个最小的提议,您的代码可能需要分解为函数,但请考虑这只是某种草稿提议。 您可以简单地替换您的 strcmp,但将 strcasecmp 替换为区分大小写的部分。

然后排序,你可以使用qsort: 定义一个用于比较的函数,例如:

int compar(const void *a, const void *b)
{
        return *(char *)a - *(char *)b;
}

并将它应用到你的单词数组中。 据我了解,ptr1 似乎符合你的话,所以你可以添加

   qsort(ptr1, count, sizeof(ptr1[0]), compar);

在最后一个 for 循环之前。

尽管如此,在我看来您需要修复提取循环,因为 valgrind 报告您的代码中存在一些错误。

关于C程序计算文本文件中的词频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34070657/

相关文章:

c - 将 char 指针强制转换为 int 指针是未定义的行为吗?

c - The C Programming Language(Second Edition) Exercise 1-1 4's Histogram' s Function中++cc[c]的作用是什么?

java - 数组不适用于小句子

python - 使用循环更新嵌套字典中的预先存在的值

Java字数统计: a mediocre implementation

java - Hadoop Mapreduce 字数统计

iphone - Objective-c 或 C 中的位掩码枚举

c - sigwait() 反复被 SIGUSR1 解锁

代码遇到段错误错误。如何修复?

c++ - 读取文本文件并在 C++ 中按行返回字数