查找文本中频率靠前的单词的C语言代码
时间: 2023-05-24 11:07:29 浏览: 131
这里是一个简单的C语言代码示例,演示如何找到文本中频率靠前的单词:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// 定义结构体来储存单词及其出现频率
struct word {
char *str;
int count;
};
void add_word(struct word **words, int *size, char *str) {
// 如果单词已经在结构体数组里,增加其计数
for (int i = 0; i < *size; i++) {
if (strcmp(str, words[i]->str) == 0) {
words[i]->count++;
return;
}
}
// 否则,分配内存存储新的单词
struct word *new_word = malloc(sizeof(struct word));
new_word->str = strdup(str);
new_word->count = 1;
// 将新的单词添加到结构体数组中
*size += 1;
*words = realloc(*words, (*size) * sizeof(struct word));
(*words)[*size-1] = new_word;
}
int compare_words(const void *a, const void *b) {
// 比较两个单词的计数
struct word *word_a = *(struct word **)a;
struct word *word_b = *(struct word **)b;
return word_b->count - word_a->count;
}
void free_words(struct word **words, int size) {
// 释放内存
for (int i = 0; i < size; i++) {
free((*words)[i].str);
free(*words[i]);
}
free(*words);
}
int main() {
char *input = "This is a sample sentence to test this simple code";
char *token = strtok(input, " ");
struct word *words = NULL;
int word_count = 0;
// 将每个单词添加到结构体数组中
while (token != NULL) {
char *lower_token = strdup(token);
for (int i = 0; lower_token[i]; i++) {
lower_token[i] = tolower(lower_token[i]);
}
add_word(&words, &word_count, lower_token);
token = strtok(NULL, " ");
}
// 按照单词计数排序
qsort(words, word_count, sizeof(struct word*), compare_words);
// 打印前10个出现最频繁的单词及其计数
for (int i = 0; i < 10; i++) {
printf("%s: %d\n", words[i]->str, words[i]->count);
}
// 释放内存
free_words(&words, word_count);
return 0;
}
```
在上面的代码示例中,我们使用了动态内存分配来储存每个单词及其出现次数,并使用 qsort() 函数按照单词计数排序。最后,我们打印前十个出现最频繁的单词及其计数,并释放整个结构体数组的内存。
阅读全文