我正在尝试编写一个获取字符串的程序,并计算在特定文件中找到该字符串的次数。
该文件目前是:你好,我的名字你好是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的索引,只有当字母之间有匹配时才会前进。如果我达到字符串的长度,则意味着我们连续发现了所有字母,并且我将计数提高了一倍。
由于某种原因,它总是返回零。
答案 0 :(得分:7)
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
返回的数据类型。否则,当char
为unsigned
类型时,c
永远不会等于EOF
,您的循环将永远不会结束。
在代码递增i
一次之前,它会从文件中读取两个字符。这对我来说似乎有问题。我将内循环中的c=fgetc(stream);
移动到该循环的末尾,例如:
while(c==*(str+i))
{
i++;
if(i==length)
{
count++;
i=0;
break;
}
c=fgetc(stream);
}