C程序用于计算文本文件中的单词频率

时间:2015-12-03 16:03:29

标签: 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;
}

1 个答案:

答案 0 :(得分:3)

这是一个最小的命题,你的代码可能需要分解为函数,但考虑到这只是某种草案命题。 您只需将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在你的代码中报告了一些错误。