【发布时间】:2019-01-08 16:03:58
【问题描述】:
我需要能够在 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;
}
【问题讨论】:
-
“忽略大写字母”是最简单的部分。读取文件后,通过
char遍历它char并执行str[i] = toupper((unsigned char) str[i]);
标签: c word-count