gpt4 book ai didi

c - C 搜索某个单词在文本文件中出现的次数

转载 作者:行者123 更新时间:2023-11-30 20:35:17 24 4
gpt4 key购买 nike

我是 C 和指针的新手,所以它仍然令人困惑!下面是一个函数的代码,其主要目的是查找某个单词在文本文件中出现的次数。任何帮助将不胜感激!

void count_occurrences (int n, FILE *file, Entry *entries) {
file = fopen("test/flicka.txt", "r");
if (file != NULL) {
char buff[LINE_MAX_CHARS];
int i = 0;
char * haystack = fgets(buff, 1000, file);
char * needle = NULL;
char * p = NULL;
while (haystack != NULL) {
for (i; i < n; i++) {
needle = entries[i].string;
while ( (p = strstr(haystack, needle)) != NULL) {
entries[i].count++;
p++;
}
}
haystack = fgets(buff, 1000, file);
i = 0;
}
fclose(file);
}
else {
printf("File not found!\n");
}
}

最佳答案

此类练习的问题在于,解决特定问题的最佳方法(附加到流的基于字符的状态机)无法扩展到更大的问题。

要以第一种方式执行此操作,您需要维护一个最初为零的“解析位置”。然后循环调用 fgetc() 直到数据用完并得到 EOF。如果该字符与解析位置处的字符匹配,则增加解析位置,如果解析位置到达字符串末尾,则有匹配,因此增加计数。如果不匹配,则根据第一个字符是否匹配将解析位置重置为零或一。

第一种方法快速简单,但不灵活。

一种更具可扩展性的方法是基于行的输入。如果您知道行必须很短,则使用大缓冲区调用 fgets,或者如果行无界,则构建“getline”。然后就行调用strstr看是否有匹配。如果有匹配项,则需要增加指针并检查另一个匹配项。

可扩展的方式将解析与 IO 分开,并允许您搜索多种模式。伪代码

while(line = getline() )
{
N += countwords(line, "myword");
}

int countwords(line, word)
{
ptr = line;
while(strstr(ptr, word))
{
ptr = strstr(ptr, word) + strlen(word); // replace strlen with 1 to allow overlaps
answer++;
}
}

显然,您现在需要修改主循环来搜索多个单词,保留一个 N 数组并对每个单词重复调用。但它可以扩展到任何类型的模式匹配。

关于c - C 搜索某个单词在文本文件中出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39887808/

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