2013-11-27 38 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

這個詞有個終結者嗎?像一個空間?如果是的話,你可以在一個字完成時使用這個確定。通過這種方式,你可以建立的話數組...這陣列上的作品後

相關問題