Как подсчитать вхождения конкретной строки в текстовом файле с помощью C - PullRequest
1 голос
/ 26 ноября 2011

Я пытаюсь выяснить, как подсчитать, сколько раз определенная строка "test" встречается в текстовом файле с использованием программирования на Си.Я хочу, чтобы программа показывала окончательный счет после завершения.

Это код, который я придумал, но, похоже, он не сработал.Счетчик, который я генерирую, немного ниже, чем тот, который на самом деле присутствует в текстовом файле.

Кто-нибудь видит, что я делаю неправильно?Я довольно новичок в программировании на C, поэтому любая оценка будет принята с благодарностью!

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

int main()
{
    FILE *ptr_file;
    char buf[200];
    char key[] = "test"; // the string I am searching for
    int wordcount = 0;

    ptr_file = fopen("input.txt","r"); // my input text file

    while (fgets(buf,200, ptr_file)!=NULL)
    {
        if((strstr(buf,key)) !=NULL){
            wordcount++;
        }
    }
    fclose(ptr_file);
    printf("%d",wordcount);
}

Ответы [ 2 ]

1 голос
/ 26 ноября 2011
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int wc(char* file_path, char* word){
    FILE *fp;
    int count = 0;
    int ch, len;

    if(NULL==(fp=fopen(file_path, "r")))
        return -1;
    len = strlen(word);
    for(;;){
        int i;
        if(EOF==(ch=fgetc(fp))) break;
        if((char)ch != *word) continue;
        for(i=1;i<len;++i){
            if(EOF==(ch = fgetc(fp))) goto end;
            if((char)ch != word[i]){
                fseek(fp, 1-i, SEEK_CUR);
                goto next;
            }
        }
        ++count;
        next: ;
    }
end:
    fclose(fp);
    return count;
}

int main(){//testestest : count 2
    char key[] = "test"; // the string I am searching for
    int wordcount = 0;

    wordcount = wc("input.txt", key);
    printf("%d",wordcount);
    return 0;
}
1 голос
/ 26 ноября 2011

strstr определяется в заголовке string.h.Если вы не включили string.h, strstr необъявлено в вашем исходном файле, и оно неявно объявляется как возвращающее int и принимающее неуказанные аргументы (то есть, как если бы оно было объявлено int strstr()).Это может быть проблематично, когда объектный файл для вашей программы связан со стандартной библиотекой C из-за возможных несоответствий сигнатур функций и, следовательно, предупреждения.

Решение простое: убедитесь, что вы включили string.h.

Что касается проблемы многократного появления строки поиска в строке, обратите внимание на первый абзац в разделе описания strstr справочной страницы :

Функция strstr () находит первое вхождение подстроки needle в строке haystack .Завершающие нулевые байты ("\ 0") не сравниваются.

Хотя вы можете использовать strstr для поиска нескольких подстрок, вам нужно будет перебрать строку, используя другое начальное расположениекаждый раз.В зависимости от того, с чего вы начнете, он может совпадать с ранее сопоставленными частями строки (например, «testest» будет считаться как 2 совпадения) или только с несопоставленными частями (например, «testest» будет считаться как 1).

Если выЖелая посчитать вхождения полного слова, а не только подстроки, strstr не очень полезно.Одним из вариантов является использование strpbrk или strcspn для поиска слов (т.е. буквенных) символов и strspn для поиска несловарных символов.С их помощью вы можете найти первый символ слова, сравнить со строкой поиска и, если она соответствует, проверить, что следующий символ не является алфавитным.Если это не так, увеличьте счетчик;если это так, перейдите к следующему слову.Кроме того, вы можете зацикливаться на каждом символе и использовать isalpha, чтобы отличать буквы от не букв (следовательно, начала и конца слов).

Другой вариант - разделить ввод на список слов, затемотсканируйте список слов для поиска слова. Функция токенизации строк сделает это, хотя и изменит буфер, который вы передаете. Вы также можете использовать fscanf, чтобы прочитать слово из файла за раз.Это дает дополнительное преимущество правильной обработки длинных строк.

...