如何使用C计算文本文件中特定字符串的出现次数

时间:2011-11-26 04:26:50

标签: c file-io counter

我试图弄清楚如何计算使用C编程在文本文件中发生特定字符串“test”的次数。我希望程序在完成后显示最终的计数。

这是我提出的代码,但它似乎没有做到这一点。我生成的计数略低于文本文件中实际存在的计数。

有谁看到我做错了什么?我对C编程很新,所以任何见解都会非常感激!

#include<stdio.h>
#include<string.h>

int main()
{
    FILE *ptr_file;
    char buf[200];
    char key[] = "test"; // the string I am searching for
    int wordcount = 0;

    ptr_file = fopen("input.txt","r"); // my input text file

    while (fgets(buf,200, ptr_file)!=NULL)
    {
        if((strstr(buf,key)) !=NULL){
            wordcount++;
        }
    }
    fclose(ptr_file);
    printf("%d",wordcount);
}

2 个答案:

答案 0 :(得分:1)

strstr在string.h头文件中定义。如果你不包含string.h,那么strstr在你的源文件中是未声明的,它会被隐式声明为返回一个int并取出未指定的参数(也就是说它就像声明int strstr()一样)。当程序的目标文件由于潜在的函数签名不匹配而链接到标准C库时,这可能会出现问题,因此会出现警告。

解决方案很简单:确保包含string.h。

对于一行中多次出现搜索字符串的问题,请注意strstr man page的说明部分中的第一段:

  

strstr()函数在字符串 haystack 中查找第一次出现的子字符串 needle 。不比较终止空字节(“\ 0”)。

虽然您可以使用strstr查找多个子字符串,但您需要循环使用字符串,每次使用不同的起始位置。根据您的起点,它可以匹配以前匹配的字符串部分(例如“testest”将计为2个匹配)或仅匹配不匹配的部分(例如“testest”将计为1)。

如果您希望计算完整单词的出现次数而不仅仅是子字符串,strstr不是很有用。一种选择是使用strpbrkstrcspn来查找单词(即字母)字符,使用strspn来查找非单词字符。通过这些,您可以找到单词的第一个字符,与搜索字符串进行比较,如果匹配,则测试下一个字符不是字母。如果不是,则递增计数;如果是,请转到下一个单词。或者,您可以遍历每个字符并使用isalpha来区分字母和非字母(因此,单词的开头和结尾)。

另一种选择是将输入分成单词列表,然后扫描单词列表中的搜索单词。 String tokenizing函数会执行此操作,但它们会更改您传入的缓冲区。您还可以使用fscanf一次从文件中读取一个单词。这具有正确处理长线的附加优点。

答案 1 :(得分:1)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int wc(char* file_path, char* word){
    FILE *fp;
    int count = 0;
    int ch, len;

    if(NULL==(fp=fopen(file_path, "r")))
        return -1;
    len = strlen(word);
    for(;;){
        int i;
        if(EOF==(ch=fgetc(fp))) break;
        if((char)ch != *word) continue;
        for(i=1;i<len;++i){
            if(EOF==(ch = fgetc(fp))) goto end;
            if((char)ch != word[i]){
                fseek(fp, 1-i, SEEK_CUR);
                goto next;
            }
        }
        ++count;
        next: ;
    }
end:
    fclose(fp);
    return count;
}

int main(){//testestest : count 2
    char key[] = "test"; // the string I am searching for
    int wordcount = 0;

    wordcount = wc("input.txt", key);
    printf("%d",wordcount);
    return 0;
}