Поиск ключевого слова в текстовом файле и регистрация его с помощью C

Я пытаюсь использовать C для поиска файла, который содержит C-код. Он предназначен для поиска по всему файлу, поиска определенных ключевых слов или символов (таких как поиск Ints, Longs, для циклов For и т. Д.) И регистрации их путем увеличения счетчика, а также подсчета всех строк кода. Затем предполагается указать общее число каждого, поэтому проценты можно рассчитать на основе того, как часто ключевое слово появляется в файле.

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

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

#define _CRT_SECURE_NO_WARNINGS

/*  Count and compute:

    number of total lines
    number and percentage of blank lines
    number and percentage of comments (start with // or /*)
    number and percentages of ints, longs, floats, doubles, char
    number and percentages of if's
    number and percentage of else's
    number and percentage of for's
    number and percentage of switch
    number and percentage of semicolons
    number and percentage of structs
    number and percentage of arrays (contains [ or ], divide count by 2)
    number of blocks (contains { or }, divide count by 2)
*/


int main(void)
{
    int lineCount = 0;  // Line counter (result) 
    int forCount = 0; // For counter
    int intCount = 0;
    char c;

    FILE *ptr_file;
    char buf[1000];

    ptr_file = fopen("file.txt", "r");
    if (!ptr_file)
        return 1;

    while (fgets(buf, 1000, ptr_file) != NULL) {


        for (c = getc(ptr_file); c != EOF; c = getc(ptr_file)) {
            if (c == '\n') // Increment count if this character is newline 
                lineCount = lineCount + 1;
        }
    }
    fclose(ptr_file);
    //End of first scan
    ptr_file = fopen("file.txt", "r");
    if (!ptr_file)
        return 1;

    while (fgets(buf, 1000, ptr_file) != NULL) {
        for (c = getc(ptr_file); c != EOF; c = getc(ptr_file)) {
            if (c == 'for') // Increment count if this character is for
                forCount = forCount + 1;
        }
    }
    fclose(ptr_file);
    //End of second scan
    ptr_file = fopen("file.txt", "r");
    if (!ptr_file)
        return 1;

    while (fgets(buf, 1000, ptr_file) != NULL) {
        for (c = getc(ptr_file); c != EOF; c = getc(ptr_file)) {
            if (c == 'int') // Increment count if this character is for
                intCount = intCount + 1;
        }
    }

    fclose(ptr_file);
    printf("\nThe file has %d lines\n", lineCount);
    printf("\nThe file has %d fors\n", forCount);
    printf("\nThe file has %d ints\n", intCount);
}

2 ответа

Вам нужно использовать sscanf и анализировать его построчно.

Для каждого найденного предмета ведение счета не должно быть проблемой.

Но, как вы уже обсуждали (просили помощи на другом форуме), вам нужна эта функция.

Чтобы получить точный ответ, может потребоваться более сложный анализ, чем вы думаете: подумайте на минуту, что long также может быть объявлен как long intи что либо long long или же long long int также допустимы объявления переменных. Кроме того, вы можете объявить несколько переменных в одной строке, и вы не хотите считать случаи, когда int является частью более длинного слова.

Для быстрого приближения, инструменты Linux grep, а также wc может быть полезно:

  • wc -l filename перечислит количество строк файла
  • grep "for" filename | wc -l перечислит количество строк, в которых for Включено

Обратите внимание, что это приблизительные значения: если for происходит более одного раза в строке, или for является частью другого слова, как forthодин экземпляр все равно будет засчитан.

Другие вопросы по тегам