//本文算法思想是对C++注释的分类讨论
// (1) a/b
// (2) //a
// (3) /*a*/
// (4) a*b
//由上述四种情况可以看出在源码中第一次遇到'/'时须分(1),(2),(3)三种情况来讨论,其他均直接输出字符即可。
//一旦第一次发现'/'则继续读入并处理,只需再读入一个字符即可分辨(1),(2)和(3).他们分别是
//'b'一般字符(说明刚才读入的'/'不是注释,应连同刚才的'/'一起输出);
// '/'单行注释的开始(继续读入直到出现换行表示单行注释的结束);
//'*'多行注释的开始(继续读入直到读入'/'表示多行注释的结束,因为C++中注释不允许嵌套。)
//算法如下
#include<iostream>
#include<fstream>
using namespace std;
void main()
{
ifstream fin;
fin.open("main.cpp",ios::in);
fin.seekg(ios::beg);
//get ch1 first and then get ch2
char ch1,ch2;//
//cout<<"a/b=?"<<endl;
//Experiment.........
while(fin.get(ch1))
{
if(ch1=='/')
{
fin.get(ch2);
if(ch2=='/')
{
while(fin.get(ch1))
if(ch1=='/n')
{
cout<<'/n';
break;
}
/*************
Experiment********/
continue;
}
else if(ch2=='*')
{
while(fin.get(ch1))
if(ch1=='/')
break;
continue;
}
else cout<<ch1<<ch2;
}//endif
cout<<ch1;
}//endwhile
fin.close();
}
缺点是留下了空行
下面给出的方法是用了Boost库中的正则表达式库regex
思路是对//...和/*...*/进行删除
但是删除之后源码的格式不能正常的对齐,下面的思路考虑到了这一点。
另外,源码本身可能包括了//...但不是注释,如:boost::regex regstart("^(//.*?\\n\\s*)|(/\\*(.|\\n)*?\\*/\\s*)");
如何将上面的保留下来?这里用了一个假设,所有的注释要么在一行的开始,要么前面只能是空格个table
这时,删除空格及其后面的注释,并补充空格
或者,删除table及其后面的注释,并补充table,从而保持源码的格式不变。
代码如下(代码中加入了各种注释,运行结果是删除注释之后的源码):
#include <iostream>
#include <string>
#include<fstream>
#include <boost/regex.hpp>
#include <boost/lexical_cast.hpp>
using namespace std;
//test0
using namespace boost;
//
/*a*/
int main() {
//...
//test1
//
boost::regex regstart("^(//.*?\\n\\s*)|(/\\*(.|\\n)*?\\*/\\s*)");
boost::regex regblank("\\x20(//.*?\\n\\s*)+");
//boost::regex regblank("(\\x20(//.*?\\n\\s*))*");
boost::regex regtable("\\x09(//.*?\\n\\s*)+");
std::string s;
/**/
/* / */
/**/
ifstream fin;
/*
/ */
fin.open("main.cpp",ios::in);
/*。。。/*/
while (true)
{
char c;fin.get(c);
if (fin.eof())
{
break;
}
s+=lexical_cast<string>(c);
}
cout<<"Before delete:"<<endl<<s<<endl;
/*cout<<s<<endl;*/
s=regex_replace(s,regstart,"");
cout<<"Delete start from blank:\n"<<s<<endl;
s=regex_replace(s,regblank,"\\x20");
cout<<"Delete start from table:\n"<<s<<endl;
s=regex_replace(s,regtable,"\\x09");
//s=regex_replace(s,reg1,"");
cout<<s<<endl;
fin.close();
}