c语言:统计一个英文的文本文件中出现次数最多的前十个单词(1)规定单词的含义为连续的字母构成的字符串,字母以外的其他符号和空白符号都视为单词之间的分隔符。(2)输出出现次数最多的前十个单词及出现次数。仅大小写不同的单词视为同一单词。
时间: 2023-11-28 08:21:23 浏览: 53
好的,这是一个很有意思的问题!首先,我们需要读取文本文件并将其分解成单词。因为单词之间的分隔符可以是任何非字母字符或空格字符,所以我们需要对文件进行逐字符读取,并将非字母字符或空格字符作为单词之间的分隔符。
读取文件可以使用 C 语言中的标准库函数 `fopen()` 和 `fread()`,其中 `fopen()` 用于打开文件, `fread()` 用于将文件内容读取到缓冲区中。
接下来,我们需要对缓冲区中的字符进行逐一扫描,以识别单词边界。如果我们找到了一个字母字符,则我们需要从该字符开始扫描,直到找到一个非字母字符或空格字符为止。此时,我们可以将这个单词加入到一个哈希表中,并增加它的出现次数。如果哈希表中已经存在该单词,则只需要增加其出现次数。
最后,我们需要在哈希表中找到出现次数最多的前十个单词。这可以通过对哈希表进行排序并取前十个元素来实现。
以下是一个可能的实现:
```c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#define MAX_WORD_LEN 100
#define MAX_WORDS 100000
typedef struct {
char word[MAX_WORD_LEN + 1];
int count;
} word_count;
int cmp_word_count(const void *a, const void *b) {
return ((word_count*)b)->count - ((word_count*)a)->count;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: %s <filename>\n", argv[0]);
return 1;
}
FILE *fp = fopen(argv[1], "rb");
if (!fp) {
printf("Failed to open file: %s\n", argv[1]);
return 1;
}
char *buf = (char*)malloc(MAX_WORDS * MAX_WORD_LEN);
if (!buf) {
printf("Failed to allocate memory.\n");
return 1;
}
int buf_size = fread(buf, 1, MAX_WORDS * MAX_WORD_LEN, fp);
fclose(fp);
if (buf_size == 0) {
printf("Failed to read file: %s\n", argv[1]);
free(buf);
return 1;
}
word_count *words = (word_count*)malloc(MAX_WORDS * sizeof(word_count));
if (!words) {
printf("Failed to allocate memory.\n");
free(buf);
return 1;
}
int word_count = 0;
char *word_start = NULL;
for (int i = 0; i < buf_size; i++) {
if (isalpha(buf[i])) {
if (!word_start) {
word_start = &buf[i];
}
} else if (word_start) {
int word_len = &buf[i] - word_start;
if (word_len > MAX_WORD_LEN) {
word_len = MAX_WORD_LEN;
}
strncpy(words[word_count].word, word_start, word_len);
words[word_count].word[word_len] = '\0';
words[word_count].count = 1;
for (int j = 0; j < word_count; j++) {
if (strcasecmp(words[j].word, words[word_count].word) == 0) {
words[j].count++;
word_count--;
break;
}
}
word_count++;
word_start = NULL;
}
}
qsort(words, word_count, sizeof(word_count), cmp_word_count);
printf("Top ten words:\n");
for (int i = 0; i < 10 && i < word_count; i++) {
printf("%s: %d\n", words[i].word, words[i].count);
}
free(words);
free(buf);
return 0;
}
```
这个程序首先从命令行参数中获取文件名,然后打开该文件并将其读取到一个缓冲区中。接下来,程序对缓冲区中的字符进行逐一扫描,并将单词存储在一个哈希表中。最后,程序对哈希表进行排序,并输出出现次数最多的前十个单词。
请注意,这个程序使用了动态内存分配,因此需要在程序结束时显式地释放分配的内存,以避免内存泄漏。
阅读全文