点击前往试题目录:https://blog.csdn.net/best335/article/details/99550556
注意点:审题需仔细 字符串处理位置要谨慎
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
string proc1(string s){//处理强调
int l=-1,r;
while((l=(s.find('_',l+1)))!=string::npos){
r=s.find('_',l+1);
s=s.substr(0,l)+"<em>"+s.substr(l+1,r-l-1)+"</em>"+s.substr(r+1,s.size()-r-1);
}
return s;
}
string proc2(string s){//处理网址
int l1=-1,r1,l2,r2;
string s1,s2;//text link
while((l1=s.find('[',l1+1))!=string::npos){
r1=s.find(']',l1),l2=s.find('(',r1),r2=s.find(')',l2);
s1=s.substr(l1+1,r1-l1-1),s2=s.substr(l2+1,r2-l2-1);
s=s.substr(0,l1)+"<a href=\""+proc1(s2)+"\">"+proc1(s1)+"</a>"+s.substr(r2+1,s.size()-r2-1);
}
return s;
}
string proc(string s){return proc1(proc2(s));}//处理行
int main(){
string s,s0;
vector<string> S;
while(getline(cin,s)||(S.size()>0&&(s="").size()==0)){
if(s.size()==0){
if(S.size()>0){//处理块
int i,ni,j,nj;
if(S[0][0]=='#'){
for(i=0,ni=S[0].size();i<ni&&S[0][i]=='#';++i);
for(j=min(i,6);i<ni&&S[0][i]==' ';++i);
cout<<"<h"<<j<<">"<<proc(s0=S[0].substr(i,ni-i))<<"</h"<<j<<">"<<endl;
}
else if(S[0][0]=='*'){
cout<<"<ul>"<<endl;
for(i=0,ni=S.size();i<ni;++i){
for(j=1,nj=S[i].size();j<nj&&S[i][j]==' ';++j);
cout<<"<li>"<<proc(s0=S[i].substr(j,nj-j))<<"</li>"<<endl;
}
cout<<"</ul>"<<endl;
}
else{
cout<<"<p>";
for(i=0,ni=S.size();i<ni;++i) cout<<proc(S[i])<<(i==ni-1?"":"\n");
cout<<"</p>"<<endl;
}
}
S.clear();
}
else
S.emplace_back(s);
}
return 0;
}