2012-12-11 96 views
1

我想使用子字符串來計算特定單詞輸入的次數。我一直在玩我的代碼,看看我是否可以使它工作但我只是不明白!使用子字符串來統計單詞出現的次數

我的代碼如下:

#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,但那不行。

+1

你可能想'strlen',而不是'sizeof'。 – cnicutar

+0

@cnicutar固定的,謝謝! –

+0

這對我來說似乎非常低效。爲什麼要將字符串解析爲子字符串?所有你需要做的是找到你的分隔符並計算結果。沒有理由浪費修改字符串的週期。使用類似'strpbrk()'的東西來查找下一個出現的幾個字符或者編寫你自己的幫助函數。 –

回答

0
while(sizeof(t) > j) 

sizeof告訴你一個類型的大小,所以你的情況,這是sizeof(char*),這是你的平臺上的指針只是大小。最有可能的是它總是4或8.替換爲strlen,它旨在告訴你一個字符串的大小。

2

如果您正在查找令牌的多個實例,則需要多次調用strtok。在隨後的調用中,作爲第一個參數傳入NULL。另外,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」

+0

我將代碼更改爲上述內容,這是您的意思或不是? –

+0

如果你想尋找另一個分隔符的文本,你需要再次調用strtok。我很驚訝它不是匹配時的無限循環,因爲t不會在while循環中重新分配。 –

+0

我真的不知道你的意思我很抱歉。你能否給我一點點提示? –

相關問題