模拟题,文本处理,具体方法看代码注释
#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;
}