忽略在 C 中用 strstr 读取的行的注释

Ignore comments from a line read with strstr in C

我必须在没有第三方库的情况下编写代码,逐行读取文件并查找开关或大小写运算符。到目前为止,我的代码是这样的:

while(fgets(st, 1001, f1))
{
    lineCnt++;
    if(strstr(st, "switch"))
    {
        if(!strstr(st, "\""))
              switchCnt++;
    }
    if(strstr(st, "case"))
    {
        if(!strstr(st, "\""))
        caseCnt++;
    }
}

这基本上是在给定行上查看是否有引号,如果有,则不要增加开关数。我认为这涵盖了大多数情况,因为我认为不会有一个实际的开关操作员连续引用,但我也对这部分的想法持开放态度。我也对案例计数器做了同样的事情。

如何忽略文件读取的注释部分,因为如果说 //switch count 会被计算在内?

要删评论就删评论。

如果您只想剪切 // 之后的所有内容,它将是:

while(fgets(st, 1001, f1))
{
    char* comment = strstr(st, "//");
    if (comment != NULL) *comment = '[=10=]';

请注意,此剪切也将应用于 "hoge///";switch 等。 (我不知道要处理的文件的语法,所以我不知道这个行为是否可以)

这个问题比您想象的要难回答。 “正确”的解决方案是编写一个完整的 C 解析器,这非常棘手。

为了把它做好,你需要一个更好的规范。但我认为我们可以假设您不会允许这样的事情:

#define switch haha
#define foobar case

还有评论。请记住,您有两种类型的评论。 ///* */。此外,您还需要处理字符串文字和多字符文字。这是一个带有一些棘手的怪癖的片段,只是为了让您了解您实际询问的内容:

/* switch program
int main(void)
// */
#include <stdio.h>

int main(void) {
    char *str = "switch\" // /*";
    /* char *str = "*/"switch";
    printf("//");
    switch((long)"case") /* { */ { /*
        case 1 : 
    */  case 1 : break;
    }

    int c = '"//"'; // Multi character constant which is including
                   // Both comment and quote character
    // This is a comment \
    and so is this
}
    

请注意,上面的代码没有意义,但可以编译。