问题描述
我必须编写没有第三方库的代码,这些库逐行读取文件并查找 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
。
(我不知道要处理的文件的语法,所以我不知道这种行为是否正常)