0

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

该文件目前是:你好我的名字你好是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,只有当字母之间存在匹配时它才会前进。如果我达到了字符串的长度,则意味着我们连续找到了所有字母,我将计数加一。

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

4

2 回答 2

8

while (!eof)、错了。

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

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

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;
}
于 2013-06-13T12:19:14.597 回答
2

char c;应该可能是为了适应返回int c;的数据类型。fgetc否则,when charis 一个unsigned类型c永远不会相等EOF,您的循环将永远不会结束。

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

    while(c==*(str+i))
    {
        i++;
        if(i==length)
        {
            count++;
            i=0;
            break;
        }
        c=fgetc(stream);
    }
于 2013-06-13T12:24:14.930 回答