使用子字符串计算单词出现的次数

时间:2012-12-11 16:58:48

标签: c

我想使用子字符串来计算输入特定单词的次数。我一直在玩我的代码,看看我是否可以使它工作但我只是不明白!

我的代码如下:

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

int main(int argc, char *argv[])
{

int i=0;

char buf[1026]={'\0'};
char *p="#EOF\n";
char *t;

while (strcmp(buf, p) != 0)
{
    fgets(buf, 1025, stdin);
    t=strtok(buf," , - \n");
    while(t != NULL)
    {
        if(strncmp(t, argv[1], strlen(argv[1])) == 0)
    {
        i++;
    }
    }
}






printf("%d\n", i);

return 0;
}

没有错误,但i的值始终为0.我不知道如何确保它在找到单词之后继续计数。我尝试了sizeof(t) < j,但这不起作用。

2 个答案:

答案 0 :(得分:2)

如果您要查找多个令牌实例,则需要多次调用strtok。在后续调用中,传入NULL作为第一个参数。请参阅man page

此外,sizeof(t)是一个常量,可能是4或8.t是一个char指针,它占用了一些字节数。如果你想看看strtok是否返回了你想要与NULL进行比较的东西。从手册页:

  

返回值

  The strtok() and strtok_r() functions return a pointer 
   to the next token, or  NULL  if there are no more tokens.

您要检查NULL以确定该行上没有其他标记。

另请注意,如果令牌桥接两个读取,您将无法获得它。例如,第1行以“,”结尾,下一个以“ - \ n”开头

答案 1 :(得分:0)

while(sizeof(t) > j)

sizeof告诉你类型的大小,所以在你的情况下,它是sizeof(char*),这只是你平台上指针的大小。最有可能的是它总是4或8.用strlen替换它,它旨在告诉你字符串的大小。