C/C++ Comment Remover 0 By DaNmarner Released
2006-11-27 11:15
218 查看
记得《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++ 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);
}
}
相关文章推荐
- What exactly is the difference between “pass by reference” in C and in C++?
- Step By Step(C++模板目录)
- Step By Step(C++模板重载和特化)
- TinyXml op by C++
- Learning C++ by Creating Games With UE4(15.05.21)(Chapter 11-4)Monster
- c++ map sort by value and sort by key(字典的遍历)
- 书评:C++网络编程,卷2 by Matthew Wilson
- [C++] Returning values by reference in C++
- 2004.07.02 MaxDB™ by MySQL 7.5.00.15 Released
- String class by C++
- 雇佣问题随机排列数组(permuteBySorting)-c++代码实现及运行实例结果
- 雇佣问题随机排列数组(permuteBySorting)-c++代码实现及运行实例结果
- Learning C++ by Creating Games With UE4(15.05.11)-4(Chapter 8-2)
- Why does wide file-stream in C++ narrow written data by default?
- Common File Extensions Used by Visual C++
- Running C++ application built by VC++ Express on another computer
- How to detect compilation by android ndk in a C/C++ file? cocos2dx
- 【记录】Accelerated C++:Practical Programming by Example第0章:开始学习C++
- Step By Step(C++模板类)
- 使用G++编译运行c++(by命令行)