求一个C++程序,可以去掉某目录下所有C++头文件和源文件中的注释行。
求一个C++程序,可以去掉某目录下所有C++头文件和源文件中的注释行。(或者有这样的现成软件也可以)比如:X:\\某目录下有若干C++的.cpp和.h文件,我希望编一个程...
求一个C++程序,可以去掉某目录下所有C++头文件和源文件中的注释行。(或者有这样的现成软件也可以)
比如:X:\\某目录下有若干C++的.cpp和.h文件,我希望编一个程序实现自动读取每一个源文件和头文件,检测其中的注释行,然后删掉所有的注释行,保存覆盖原来的文件就可以。
为了方便处理,所有的源文件和头文件中注释行都是以//开头的,甚至可以是单独占一行的。
回答者可以给我提供思路,如果写一段示例性代码更好,谢谢。
目的嘛,你懂得,有时候不可控因素(比如领导要求)不得不给别人源代码,但又不想泄漏自己的某些技术,只有通过降低代码的可读性了。 展开
比如:X:\\某目录下有若干C++的.cpp和.h文件,我希望编一个程序实现自动读取每一个源文件和头文件,检测其中的注释行,然后删掉所有的注释行,保存覆盖原来的文件就可以。
为了方便处理,所有的源文件和头文件中注释行都是以//开头的,甚至可以是单独占一行的。
回答者可以给我提供思路,如果写一段示例性代码更好,谢谢。
目的嘛,你懂得,有时候不可控因素(比如领导要求)不得不给别人源代码,但又不想泄漏自己的某些技术,只有通过降低代码的可读性了。 展开
展开全部
做一个状态机
下面的状态表示:
0: 正在分析
1:读到第一个/
2:读完第二个/,"//...
3:读到 "/*...
4:读到 "/*...*
5:读到第一个"
6:读到字符串里的转义符 "...\
7:找到注释
0和7是等价的状态,但是可以用7状态做些特别的事情,比如这个时候删除刚找到的注释等。最后的程序如下,输入输出还是用C的文件比较方便:
#include "stdio.h"
#include "string"
char fsm[8][128];
void initfsm()
{
?const int line_len=sizeof(char)*128;
?memset(fsm[0],0,line_len);
?memset(fsm[1],0,line_len);
?memset(fsm[2],2,line_len);
?memset(fsm[3],3,line_len);
?memset(fsm[4],3,line_len);
?memset(fsm[5],5,line_len);
?memset(fsm[6],5,line_len);
?memset(fsm[7],0,line_len);
?fsm[0]['/']=1;
?fsm[0]['"']=5;
?fsm[1]['/']=2;
?fsm[1]['*']=3;
?fsm[1]['"']=5;
?fsm[2]['\n']=7;
?fsm[3]['*']=4;
?fsm[4]['/']=7;
?fsm[4]['*']=4;
?fsm[5]['"']=0;
?fsm[5]['\\']=6;
?fsm[7]['/']=1;
?fsm[7]['"']=5;
}
int main()
{
?int state=0;
?char c;
?std::string s;
?FILE *fin=fopen("e:\\in.txt","r");
?FILE *fout=fopen("e:\\out.txt","w");
?initfsm();
?while(fscanf(fin,"%c",&c)!=EOF)
?{
??state=fsm[state][c];
??s+=c;
??switch(state)
??{
??case 0:
???fprintf(fout,"%s",s.c_str());
???s="";
???break;
??case 7:
???s="";
???if(c=='\n')
???{
????fputc(c,fout);
???}
???break;
??}
?}
?fclose(fin);
?fclose(fout);
?return 0;
}
下面的状态表示:
0: 正在分析
1:读到第一个/
2:读完第二个/,"//...
3:读到 "/*...
4:读到 "/*...*
5:读到第一个"
6:读到字符串里的转义符 "...\
7:找到注释
0和7是等价的状态,但是可以用7状态做些特别的事情,比如这个时候删除刚找到的注释等。最后的程序如下,输入输出还是用C的文件比较方便:
#include "stdio.h"
#include "string"
char fsm[8][128];
void initfsm()
{
?const int line_len=sizeof(char)*128;
?memset(fsm[0],0,line_len);
?memset(fsm[1],0,line_len);
?memset(fsm[2],2,line_len);
?memset(fsm[3],3,line_len);
?memset(fsm[4],3,line_len);
?memset(fsm[5],5,line_len);
?memset(fsm[6],5,line_len);
?memset(fsm[7],0,line_len);
?fsm[0]['/']=1;
?fsm[0]['"']=5;
?fsm[1]['/']=2;
?fsm[1]['*']=3;
?fsm[1]['"']=5;
?fsm[2]['\n']=7;
?fsm[3]['*']=4;
?fsm[4]['/']=7;
?fsm[4]['*']=4;
?fsm[5]['"']=0;
?fsm[5]['\\']=6;
?fsm[7]['/']=1;
?fsm[7]['"']=5;
}
int main()
{
?int state=0;
?char c;
?std::string s;
?FILE *fin=fopen("e:\\in.txt","r");
?FILE *fout=fopen("e:\\out.txt","w");
?initfsm();
?while(fscanf(fin,"%c",&c)!=EOF)
?{
??state=fsm[state][c];
??s+=c;
??switch(state)
??{
??case 0:
???fprintf(fout,"%s",s.c_str());
???s="";
???break;
??case 7:
???s="";
???if(c=='\n')
???{
????fputc(c,fout);
???}
???break;
??}
?}
?fclose(fin);
?fclose(fout);
?return 0;
}
展开全部
先查找//两个字符串(可以使用strcmp),检查到之后就删除它后边的内容直到遇到换行符,也可以把注释符一起删除了,换行符就不要删除了。一般上换行符是“\r\n”两个连着的字符,这个不要搞错了。这个应该难度不大,今天在网上帮人写了好几个小程序了,不想玩了。你自己搞吧。呵呵!
如果程序写的差不多了,可以发给我,我帮你调试。
如果程序写的差不多了,可以发给我,我帮你调试。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
能把你希望怎样解决问题,描述的更清楚一些吗!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询