1. 程式人生 > >CCF認證 2017-03 Markdown

CCF認證 2017-03 Markdown

模擬題,文字處理,具體方法看程式碼註釋

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=100+10;
string ans[N];
int main()
{
	string s;
	bool p=false,u=false; //輔助標記 ,u代表列表,p代表段落 
	string a="",b=""; //輔助儲存字串 
	int k=0; //記錄行數 
	for(int i=0;i<N;i++) ans[i]="";
	while(getline(cin,s)) //這裡先處理區塊,並儲存 
	{
		if(s.length()==0) //空行 
		{
			if(u)
			{
				ans[k]+="</ul>";
				k++;
				u=false;
			}
			if(p)
			{
				ans[k-1]+="</p>";
				p=false;
			}
		}
		else if(s[0]=='#') //標題 
		{
			int t=0;
			while(s[0]=='#') s.erase(0,1),t++;
			while(s[0]==' ') s.erase(0,1);
			ans[k]+="<h";ans[k]+='0'+t;ans[k]+='>';
			ans[k]+=s;ans[k]+="</h";ans[k]+='0'+t;ans[k]+='>';
			k++;
		}
		else if(s[0]=='*') //無序列表 
		{
			if(!u)
			{
				u=true;
				ans[k]+="<ul>";k++;
			}
			s.erase(0,1);
			while(s[0]==' ') s.erase(0,1);
			ans[k]+="<li>";ans[k]+=s;ans[k]+="</li>";
			k++;
		}
		else //段落 
		{
			if(!p)
			{
				ans[k]+="<p>";
				p=true;
			}
			ans[k]+=s;
			k++;
		}
	} //檔案結束後,要像讀到空行那樣處理 
	if(u)
	{
		ans[k]+="</ul>";
		k++;
		u=false;
	}
	if(p)
	{
		ans[k-1]+="</p>";
		p=false;
	}
	//for(int i=0;i<k;i++) cout<<ans[i]<<endl;
	for(int i=0;i<k;i++)
	{
		for(int j=0;j<ans[i].length();j++) //這裡處理行內 
		{
			if(ans[i][j]=='_') //發現強調,處理完後,j依然指向原位置,這樣就可以巢狀處理強調和連結 
			{
				ans[i].erase(j,1);
				while(ans[i][j]!='_') a+=ans[i][j],ans[i].erase(j,1);
				ans[i].erase(j,1);
				ans[i].insert(j,"</em>");
				ans[i].insert(j,a);
				ans[i].insert(j,"<em>");
				a="";
			}
			if(ans[i][j]=='[') //發現連結,處理完後,j依然指向原位置,這樣就可以巢狀處理強調和連結 
			{
				ans[i].erase(j,1);
				while(ans[i][j]!=']') a+=ans[i][j],ans[i].erase(j,1);
				ans[i].erase(j,2);
				while(ans[i][j]!=')') b+=ans[i][j],ans[i].erase(j,1);
				ans[i].erase(j,1);
				ans[i].insert(j,"</a>");
				ans[i].insert(j,a);
				ans[i].insert(j,"\">");
				ans[i].insert(j,b);
				ans[i].insert(j,"<a href=\"");
				a=b="";
			}
		}
	}
	for(int i=0;i<k;i++) cout<<ans[i]<<endl;
	return 0;
}