2013-11-27 3 views
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){ 
     if((strstr(temp,key))!= NULL){ 
      count++; 
     } 
    } 
    fclose(f); 
    return count; 
} 

Я прочитал через текстовый файл в, и смотреть через него на ключ. Если я нахожу его, я увеличиваю счет. Однако это, похоже, работает только в том случае, если в txt-файле имеется только один ключ для каждого из них. Например, если текстовый файл является:

key Key key key 

и символ * ключ «ключ», то рассчитывать только 1, но счетчик должен быть на самом деле 3. Однако, если текстовый файл является:

key 
key 
Key 
key 

Затем он возвращает правильный счетчик (3). Не уверен, что здесь не так.

+2

1. 'fgets' читает целую строку за раз (или до заданной максимальной длины) 2.' strstr' возвращает ** первое ** вхождение подстроки. – 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

слова имеют терминатор? как пространство? если да, вы можете использовать это для определения, когда заканчивается слово. таким образом, вы можете создать массив слов ... и после работ по этому массиву

Смежные вопросы