(笔试题)C++删除文件中的注释

//本文算法思想是对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();
}

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值