每日一题(26)——删除注释&&删除行号 C++

题目1:删除注释

删除C++代码中的注释部分

1. //Annotation

2./*Annotation*/

 

思路:

通过char保存出现的第一个’/‘,判断第二个字符是否为'/'或'*'

若为’//‘:则一直到该行末尾,即判断出现'\n'

若为’/*‘:则每次后移一位,判断该位置是否为'/'&&前一位置是否为'*'

 

代码(代码中判断过多,容易绕晕+_+):

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

string filename = "D:/test.cpp";

int main()
{
	ifstream inf;
	inf.open(filename);
	if(!inf)
	{ cout<<"Can Not Open File!"<<endl; return 0;}
	char c1,c2,tmpC;
	tmpC='\0';
	while (inf.get(c1))//若使用inf>>c1,则无法读取换行或空格;
	{
		if(c1=='/')
		{
			inf.get(c2);

			if (c2=='/')//情况1:'//'
			{
				while(inf.get(c1))
				{
					if (c1=='\n')
					{
						cout<<'\n';
						break;
					}
					
				}
			continue;
			}
			/*/情况2:需每次只后移一位/*/
			else if (c2=='*')
			{
				while (inf.get(c1))
				{
					if (tmpC=='*' && c1=='/')
						break;
					tmpC=c1;
				}
			continue;
			}
			
			else 
				cout<<c1<<c2;
		}//endif
		else//如果不加else会导致将/'变成/'/(即:c1,c2,c1)
			cout<<c1;
	}//endwhile
	inf.close();

	/***test***/
// 	char tmpC;
// 	inf.open(filename);
// 	while(inf.get(tmpC))
// 		if(tmpC=='/')
// 			cout<<tmpC;
//***** 	inf.close();
	
}


每日一题(26)——删除注释&&删除行号 C++_第1张图片

 

Reference:

http://blog.csdn.net/clamreason/article/details/5944318(这位帅哥用Boost库里的regex正则表达式重新写了,代码简洁了很多,思路也很清楚了)

 

 

 

题目2:删除行号

有时对代码进行Ctrl+C与Ctrl+V时,会附带行号,删除代码开头部分的行号。

 

思路:

使用getline获得每一行,然后检查第一个元素是否为数字,若是则整体前移一位。

 

代码:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

void moveOne(string& str)
{
	int length=str.length();
	for(int i=1;i<length; i++) str[i-1]=str[i];
	str[length-1]='\0';
}
void CheckAndMove(string& str)
{
	while (str.size()>0&&'0'<=str[0]&&str[0]<='9')
	{
		moveOne(str);
	}
}

int main()
{
	ifstream infile("D:/in.txt");
	ofstream outfile("D:/out.txt");
	string str;
	while (getline(infile,str))
	{
		CheckAndMove(str);	
		for(int i=0; i<str.length(); i++) cout<<str[i];
		cout<<endl;
		outfile<<str<<endl;
	}
}


 

 

你可能感兴趣的:(每日一题(26)——删除注释&&删除行号 C++)