匿名用户
1级
2007-07-21 回答
你这个实现太简单了,不够的
想了一会儿,不行,绝对不是三言两语说得清楚的,就你这段代码来说,需要考虑以下几点:
1. 基于文件操作绝对太慢,应该读入内存操作;
2. fgetc读一个字符就会自动后移文件指针,不用fseek;
3. /* */这样一对才是一个注释,不是说找到一个/*就算一个注释了;
4. //的控制范围为当前行;
5. /* */的控制范围是没有限定的,可以是多行;
6. 嵌套问题:
A. 如果当前行内/*或//出现在//之后,应该不认为是注释
B. 如果//出现在一对/**/的范围内,应该不认为是注释
C. /**/内部再存在/**/怎么对待?
7. 换行问题。如果符号//,/*,*/被\分割在不同的行内怎么办?
恐怖了~~~~~
给你从CSDN找了一段代码,我没试过,希望有用。
/*统计c中代码行和注释行的数量*/
#include
struct fun{
int zhushi;
int hangshu;
int flagzhushi;
int *flagzhw;
}a;
struct fun *p=&a;
void recomment(int c,struct fun *p);
void in_comment(struct fun *p);
void echo_quote(int c);
main()
{
int c;
while( (c=getchar())!=EOF )
recomment(c,p);
printf("%d,%d\n",p->zhushi,p->hangshu);
return 0;
} /*主函数完成*/
void recomment(int c,struct fun *p)
{
int d;
if (c == '/'){
if ( (d=getchar()) =='*' )
in_comment(p);/* 进入注释处理函数*/
else if ( d == '/' )
recomment(d,p); /*递归*/
}
else if ( c == '\'' || c == '"' )
echo_quote(c); /* 在引号内的注释不算*/
else if ( c == '\n'){ /* 对回车的处理(考虑了各种情况)*/
if(p->flagzhushi == 1 ) /*此行有注释*/
++ (p->zhushi);
if ( p->flagzhw==1 )
++ (p->hangshu);
p->flagzhw=p->flagzhushi=0;
}else if ( p->flagzhw == 0 && c !=' ' )
p->flagzhw=1;
} /*完成*/
void in_comment(struct fun *p)
{
int c,d;
c=getchar();
d=getchar();
while ( c != '*' || d != '/' ){
if ( c == '\n' ){
++ (p->zhushi);
if ( p->flagzhw == 1 )
++ (p->hangshu);
}
c=d;
d=getchar();
}
p->flagzhushi=1;
} /* 完成*/
void echo_quote(int c)
{
int d;
while ( (d=getchar()) !=c )
if ( d=='\\')
getchar(); /*忽略转义字符*/
} /*完成*/