如何计算“的数量”//&引用;用C注释的行?
我试图计算文件中的“/”注释行数,而不是注释总数。 我尝试使用strstr()函数检查字符串“/”是否在字符串行中,但它正在计算每一行如何计算“的数量”//&引用;用C注释的行?,c,C,我试图计算文件中的“/”注释行数,而不是注释总数。 我尝试使用strstr()函数检查字符串“/”是否在字符串行中,但它正在计算每一行 case(3) : while (fgets(line, 300, q)){ if (strstr(line, "//") == NULL) CommentedRows++; } 我还尝试使用strhr()查找第一个出现的“/”符号,然后检查下一个符号是否为“/”,但结果总是0?来自: 这些函数返回指向子字符串开头的指针,如果找不
case(3) :
while (fgets(line, 300, q)){
if (strstr(line, "//") == NULL) CommentedRows++;
}
我还尝试使用strhr()查找第一个出现的“/”符号,然后检查下一个符号是否为“/”,但结果总是0?来自:
这些函数返回指向子字符串开头的指针,如果找不到子字符串,则返回NULL
所以你应该这么做
if (strstr(line, "//") != NULL)
{
CommentedRows++;
}
甚至更短
if (strstr(line, "//"))
{
CommentedRows++;
}
但是,这只是告诉您,行
包含C-“string”“//”
的某个地方,但这是否被解释为C++/C99注释则是另一回事。来自:
这些函数返回指向子字符串开头的指针,如果找不到子字符串,则返回NULL
所以你应该这么做
if (strstr(line, "//") != NULL)
{
CommentedRows++;
}
甚至更短
if (strstr(line, "//"))
{
CommentedRows++;
}
然而,这只是告诉你,
行
包含C-“string”“//”
的某个地方,不管这是否被解释为C++/C99注释是另一回事。仅仅因为一行上有//并不意味着它有注释,因为//可能是字符串的一部分,另一条注释的一部分,甚至是xmldoc注释的一部分
假设要计算“完全注释”的行数,即它们以注释开头,前面可能有可选的空格字符,那么这可能是一个解决方案:
bool IsFullyCommentedLine(char*line)
{
//对于行中的每个字符
对于(int i=0;行[i]!=0;i++)
{
char c=行[i];
如果/是另一个,我们认为
//要完全注释的行
如果(c=='/'&&line[i+1]=='/')
{
返回true;
}
//如果我们找到除了空白以外的任何东西,
我们认为这条线不能完全注释。
如果(c!=''&&c!='\t'),则为else
{
打破
}
//只要我们到了这里,就有空白
//这条线的开始,所以我们继续寻找。。。
}
返回false;
}
int CountFullyCommentedLines(文件*FILE)
{
字符缓冲区[1024];
int-commentCount=0;
而(char*line=fgets(缓冲区,1024,文件))
{
如果(IsFullyCommentedLine(行))
commentCount++;
}
返回注释计数;
}
int main(int argc,char*argv[])
{
如果(argc==2)
{
FILE*FILE=fopen(argv[1],“r”);
printf(“完全注释的行数,即以可选空格/制表符和//:\r\n开头的行数”);
printf(“%i\r\n”,countfullycommentedline(文件));
fclose(文件);
}
返回0;
}
再一次,假设您不想对在中间行开始的注释进行计数,只是注释整个行的注释。
只是因为一行有/不意味着有注释,因为/可能是字符串的一部分,是另一注释的一部分,甚至是XMLDOC注释的一部分。 假设要计算“完全注释”的行数,即它们以注释开头,前面可能有可选的空格字符,那么这可能是一个解决方案:bool IsFullyCommentedLine(char*line)
{
//对于行中的每个字符
对于(int i=0;行[i]!=0;i++)
{
char c=行[i];
如果/是另一个,我们认为
//要完全注释的行
如果(c=='/'&&line[i+1]=='/')
{
返回true;
}
//如果我们找到除了空白以外的任何东西,
我们认为这条线不能完全注释。
否则,如果(c!=“&&c!=”\t')
{
打破
}
//只要我们到了这里,就有空白
//这条线的开始,所以我们继续寻找。。。
}
返回false;
}
int CountFullyCommentedLines(文件*FILE)
{
字符缓冲区[1024];
int-commentCount=0;
而(char*line=fgets(缓冲区,1024,文件))
{
如果(IsFullyCommentedLine(行))
commentCount++;
}
返回注释计数;
}
int main(int argc,char*argv[])
{
如果(argc==2)
{
FILE*FILE=fopen(argv[1],“r”);
printf(“完全注释的行数,即以可选空格/制表符和//:\r\n开头的行数”);
printf(“%i\r\n”,countfullycommentedline(文件));
fclose(文件);
}
返回0;
}
再次,假设你不想计算在中间行开始的注释,只是注释整个行的注释。
你是指<代码>如果(STRSTR(行,//))被引用行++,<代码>??仅供参考——您的代码也将匹配printf(“/”)
不确定这是否是您的问题。if(strstrstr(line,“/”)!=NULL)
这就是我认为应该是的代码。我认为如果==NULL,则找到匹配项?使用所有警告和调试信息编译(gcc-Wall-Wextra-g
)。然后使用调试器(gdb
)。也许虫子在别处!你的意思是if(strstrstr(行“/”)CommentedRows++代码>??仅供参考——您的代码也将匹配printf(“/”)
不确定这是否是您的问题。if(strstrstr(line,“/”)!=NULL)
这就是我认为应该是的代码。我认为如果==NULL,则找到匹配项?使用所有警告和调试信息编译(gcc-Wall-Wextra-g
)。然后使用调试器(gdb
)。也许虫子在别处!先生,我想应该检查一下,这两个字符必须是前两个字符s@Gopi:/
可以开始注释,即使它们不是第一个字符,例如,类似于此行<代码>标准::cout if(strstrstr(行“/”){CommentedRows++;}结果0 evrytime@BasileStarynkevitch是的,我的意思是这不会给出正确的评论数量。OP的代码中必须有一些指导原则,说明评论应该在