gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:04:46 26 4
gpt4 key购买 nike

我需要能够用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com