忽略在 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
}
请注意,上面的代码没有意义,但可以编译。
我必须在没有第三方库的情况下编写代码,逐行读取文件并查找开关或大小写运算符。到目前为止,我的代码是这样的:
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
}
请注意,上面的代码没有意义,但可以编译。