0

我正在尝试使用 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);
}
4

2 回答 2

1

您需要使用sscanf并逐行解析它。

对于发现的每个项目,保持计数应该是没有问题的。

但是正如您所讨论的(在其他论坛上寻求帮助),您需要的功能就是这个。

于 2019-02-25T03:45:49.090 回答
0

得到一个准确的答案可能需要比你想象的更复杂的解析:考虑一下 along也可以被声明为 a long int,并且要么 要么long long也是long long int有效的变量声明。此外,您可以在同一行声明多个变量,并且您不想计算int较长单词的一部分的实例。

为了快速近似,Linux 工具grepwc可能会有所帮助:

  • wc -l filename将列出文件的行数
  • grep "for" filename | wc -l将列出for包含a 的行数

请注意,这些是近似值:如果for在一行中出现不止一次,或者for是另一个单词(如 )的一部分,forth则仍将计算一个实例。

于 2019-02-25T01:17:45.603 回答