搜索单词在C中的文本文件中出现的次数

时间:2016-10-06 04:57:36

标签: c pointers

我是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");
    }
}

1 个答案:

答案 0 :(得分:0)

这样的练习的问题在于解决特定问题的最佳方法 - 连接到流的基于字符的状态机 - 不会扩展到更大的问题。

首先,你保持一个“解析位置”,最初为零。然后在循环中调用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++; 
   }
}

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