记得《The C Programming Language》写有一道练习就是写一个去掉注释的程序,今天把它重写了一遍,发现好简单啊。这个小程序是我在cmd下面用vim+gcc+gdb敲出来的算是热热手。
我把它叫做C/C++ Comments Remover ,这个版本是0。实现了删除/**/和//两种注释的基本功能。
用法是:ccr 源文件.c [目标文件.c]
如果没有目标文件,就产生一个 源文件_CCRed.c的输出文件。
这个CCR00.zip里有代码和可执行程序
代码如下:
/**/
/*
* C/C++ CommentRemover 0 by DaNmarner
* DaNmarner@gmail.com Http://blog.csdn.net/DaNmarner
* Just basiclly remove the comments
* 10/27/2006
*/
#include < stdio.h >
#include < string .h >
#include < stdlib.h >
#define DEBUG_
void do_quote( void );
int rcomment( void );
void showhelp( void );
FILE * src_f, * dest_f;
int main( int argc, char * argv[])
... {
char dest[256];
int rmn=0;
char c1;
if (argc!=2 && argc!=3) ...{
showhelp();
return 0;
}
if((src_f=fopen(argv[1],"r"))==NULL)...{
printf("Error opening file %s ",argv[1]);
return 0;
}
if(3==argc) strcpy(dest,argv[2]);
else ...{
strcpy(dest,argv[1]);
strcpy(strrchr(dest,'.'),"_CCRed");
strcat(dest,strrchr(argv[1],'.'));
}
if((dest_f=fopen(dest,"w"))==NULL)...{
printf("Error creating file %s ",dest);
return 0;
}
#ifdef DEBUG
dest_f=stdout;
#endif
while((c1=fgetc(src_f))!=EOF)...{
if(c1=='/')
rmn+=rcomment()?1:0;
else if(c1=='"') do_quote();
else if(c1=='/')...{
fputc(c1,dest_f);
if((c1=fgetc(src_f))!=EOF)
fputc(c1,dest_f);
}else fputc(c1,dest_f);
}
printf((rmn==0)?" No C/C++ comment exists, ":
" Successfully removed %d commments! ",rmn);
printf("Please check output file %s ",dest);
return 0;
}
void showhelp( void )
... {
puts(" C/C++ Comment Remover by DaNmarner 2006.11");
puts("Http://blog.csdn.net/DaNmanrer DaNmarner@gmail.com ");
puts(" Function: Remove Comments of C/C++ sytle from source file.");
puts(" Useage: ccr SourceFile [Destination] ");
}
int rcomment( void )
... {
int c,itis=1;
if((c=fgetc(src_f))==EOF) exit(0);
else
if(c=='/')
while((c=fgetc(src_f))!=' ' && c!=EOF);
else if(c=='*') ...{
int in_comment=1;
while(in_comment)...{
c=fgetc(src_f);
if (c==EOF) exit(0);
else if (c=='*')
if((c=fgetc(src_f))=='/')
in_comment=0;
else if(c==EOF) exit(0);
}
}else...{
fputc('/',dest_f);
fputc(c,dest_f);
itis=0;
}
return itis;
}
void do_quote( void )
... {
int c,in_quote=1;
fputc('"',dest_f);
while(in_quote)
if((c=fgetc(src_f))==EOF) exit(0);
else...{
if(c=='/')...{
fputc('/',dest_f);
fputc(fgetc(src_f),dest_f);
} else if(c=='"')...{
fputc(c,dest_f);
in_quote=0;
}else fputc(c,dest_f);
}
}
* C/C++ CommentRemover 0 by DaNmarner
* DaNmarner@gmail.com Http://blog.csdn.net/DaNmarner
* Just basiclly remove the comments
* 10/27/2006
*/
#include < stdio.h >
#include < string .h >
#include < stdlib.h >
#define DEBUG_
void do_quote( void );
int rcomment( void );
void showhelp( void );
FILE * src_f, * dest_f;
int main( int argc, char * argv[])
... {
char dest[256];
int rmn=0;
char c1;
if (argc!=2 && argc!=3) ...{
showhelp();
return 0;
}
if((src_f=fopen(argv[1],"r"))==NULL)...{
printf("Error opening file %s ",argv[1]);
return 0;
}
if(3==argc) strcpy(dest,argv[2]);
else ...{
strcpy(dest,argv[1]);
strcpy(strrchr(dest,'.'),"_CCRed");
strcat(dest,strrchr(argv[1],'.'));
}
if((dest_f=fopen(dest,"w"))==NULL)...{
printf("Error creating file %s ",dest);
return 0;
}
#ifdef DEBUG
dest_f=stdout;
#endif
while((c1=fgetc(src_f))!=EOF)...{
if(c1=='/')
rmn+=rcomment()?1:0;
else if(c1=='"') do_quote();
else if(c1=='/')...{
fputc(c1,dest_f);
if((c1=fgetc(src_f))!=EOF)
fputc(c1,dest_f);
}else fputc(c1,dest_f);
}
printf((rmn==0)?" No C/C++ comment exists, ":
" Successfully removed %d commments! ",rmn);
printf("Please check output file %s ",dest);
return 0;
}
void showhelp( void )
... {
puts(" C/C++ Comment Remover by DaNmarner 2006.11");
puts("Http://blog.csdn.net/DaNmanrer DaNmarner@gmail.com ");
puts(" Function: Remove Comments of C/C++ sytle from source file.");
puts(" Useage: ccr SourceFile [Destination] ");
}
int rcomment( void )
... {
int c,itis=1;
if((c=fgetc(src_f))==EOF) exit(0);
else
if(c=='/')
while((c=fgetc(src_f))!=' ' && c!=EOF);
else if(c=='*') ...{
int in_comment=1;
while(in_comment)...{
c=fgetc(src_f);
if (c==EOF) exit(0);
else if (c=='*')
if((c=fgetc(src_f))=='/')
in_comment=0;
else if(c==EOF) exit(0);
}
}else...{
fputc('/',dest_f);
fputc(c,dest_f);
itis=0;
}
return itis;
}
void do_quote( void )
... {
int c,in_quote=1;
fputc('"',dest_f);
while(in_quote)
if((c=fgetc(src_f))==EOF) exit(0);
else...{
if(c=='/')...{
fputc('/',dest_f);
fputc(fgetc(src_f),dest_f);
} else if(c=='"')...{
fputc(c,dest_f);
in_quote=0;
}else fputc(c,dest_f);
}
}