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

问题描述

我必须编写没有第三方库的代码,这些库逐行读取文件并查找 switch 或 case 运算符。到目前为止,我的代码是这样的:

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

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

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

解决方法

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

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

Failed: element click intercepted: Element is not clickable at point (512,828)

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

/* */

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

,

要剪切评论,请剪切评论。

如果你只是想剪掉 // 之后的所有东西,那就是:

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

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