计算文件中单词的次数

时间:2013-06-13 12:13:25

标签: c string file count

我正在尝试编写一个获取字符串的程序,并计算在特定文件中找到该字符串的次数。

该文件目前是:你好,我的名字你好是oria 我喜欢你好编程

我正在计算的这个词是你好。

这是我的代码

int num_of_words(FILE* stream,char* str)
{
    int count=0,i=0,length;
    char c;
    rewind(stream);
    length=strlen(str);
    do
    {
        c=fgetc(stream);
        while(c==*(str+i))
        {
            c=fgetc(stream);
            i++;
            if(i==length)
            {
                count++;
                i=0;
            }
        }
        i=0;
    }while(c!=EOF);
    return count;
}

这个想法是有一个叫做i的索引,只有当字母之间有匹配时才会前进。如果我达到字符串的长度,则意味着我们连续发现了所有字母,并且我将计数提高了一倍。

由于某种原因,它总是返回零。

2 个答案:

答案 0 :(得分:7)

予。 while (!eof) is wrong.

II。不要重新发明轮子 - C标准库中有strstr() function,它可以帮助您在另一个字符串中找到子字符串。

我宁愿将文件读入缓冲区,然后使用以下函数。如果文件不是太大,这应该不是问题。

int count(const char *haystack, const char *needle)
{
    int n = 0;
    const char *p = haystack;
    size_t len = strlen(needle);
    while (p = strstr(p, needle)) {
        n++;
        p += len;
    }

    return n;
}

答案 1 :(得分:2)

char c;应该是int c;,以适应fgetc返回的数据类型。否则,当charunsigned类型时,c永远不会等于EOF,您的循环将永远不会结束。

在代码递增i一次之前,它会从文件中读取两个字符。这对我来说似乎有问题。我将内循环中的c=fgetc(stream);移动到该循环的末尾,例如:

    while(c==*(str+i))
    {
        i++;
        if(i==length)
        {
            count++;
            i=0;
            break;
        }
        c=fgetc(stream);
    }