2013-11-27 121 views
2

这是我现在所拥有的:如何算一个字有多少次出现在一个txt文件

int findKey(char *in, char *key, int buf){ 
    int count = 0; 
    FILE *f; 
    f = fopen(in,"r"); 
    char temp[buf]; 
    while(fgets(temp,buf,f) != NULL){ 
     if((strstr(temp,key))!= NULL){ 
      count++; 
     } 
    } 
    fclose(f); 
    return count; 
} 

我通过txt文件读取,并通过它查找键。如果我找到它,那么我会增加计数。但是,如果txt文件中只有一个关键字出现,这似乎只能起作用。例如,如果txt文件是:

key Key key key 

与char *键为“关键”再算上仅为1,但数量实际上应该是3 但是,如果txt文件是:

key 
key 
Key 
key 

然后它返回正确的计数(3)。不知道这里有什么问题。

+2

1.'fgets'每次读取一行(或者直到给定的最大长度)2.'strstr'返回子字符串的** first **事件。 – Kninnug

+0

您的代码只能检测到每个“buf”字节的单个事件,在这种情况下恰好是单行。 – Overv

+0

fgets一次读取一行。如果你想你的键是空格分隔使用fscanf(temp,“%s”,word) – Jordonias

回答

2
int findKey(char *in, char *key, int buf){ 
int count = 0; 
FILE *f; 
f = fopen(in,"r"); 
char temp[buf]; 
while(fgets(temp,buf,f) != NULL){ 
    char *p = temp; 
    while((p=(strstr(p,key)))!= NULL){ 
     count++; 
     ++p; 
    } 
} 
fclose(f); 
return count; 
} 
+0

不应该那个内部'if'是'while'吗? – fpw

+0

@fpw while,updated –

+0

真棒,工作!还有一个问题,我将如何做到这一点,以便它只能识别一个完整的字符串,如键而不是ikey。 'ikey key Key' 应该只返回1,但它现在返回2. – user2923535

1

fgets只读一行,而strstr只会告诉您是否在该行中出现字符串(以及位置)。

使用另一个调用strstr的循环,直到它不再找到子字符串,即使用strstr的结果知道下一个搜索的位置(增加1)。

+0

这个循环应该在if语句中吗? – user2923535

+0

它应该替换if语句,因为您需要strstr的返回值。虽然它不是NULL,但您必须再次调用strstr,返回值为+1。 – fpw

1

这个词有个终结者吗?像一个空间?如果是的话,你可以在一个字完成时使用这个确定。通过这种方式,你可以建立的话数组...这阵列上的作品后

相关问题