题目链接
一道很有区分度的模拟题,我做了1.5h~
本质上如果不算强调和链接的影响 我们是不难做出前三种情况的
但是 随着对这道题目的深入 我发现做出这道题目主要有两个难点: 1.要考虑到输入状态的转移,比如输入段落切换到输入表格、输入表格切换到输入段落 2.虽然强调不存在嵌套 但链接和强调都存在嵌套 我们可以强调处理完再处理链接,这两种先后顺序处理是不影响的(可以观察替换格式易得)
代码语言:javascript复制#include<bits/stdc .h>
using namespace std;
string s;
void f1();
void f2();
void f3();
string pr1(string s);
string pr2(string s);
string pr1(string s){
string ans;
for(int i=0;s[i];i ){
if(s[i]=='_'){
//cout<<s<<"a"<<endl;
int j=i 1;
while(s[j]&&s[j]!='_')j ;
string tepp="<em>" s.substr(i 1,j-i-1) "</em>";
ans =tepp;
i=j;
continue;
}
ans =s[i];
}
ans=pr2(ans);
return ans;
}
string pr2(string s){
string ans;
for(int i=0;s[i];i ){
if(s[i]=='['){
//cout<<s<<"a"<<endl;
int j=i 1,cun;
while(s[j]&&s[j]!=']')j ;
string text=s.substr(i 1,j-i-1);
cun=j 2;
j =2;
while(s[j]!=')')j ;
string link=s.substr(cun,j-cun);
string tepp="<a href="" link "">" text "</a>";
ans =tepp;
i=j;
continue;
}
ans =s[i];
}
return ans;
}
void f1(){
int cnt=0;
while(cnt<s.size()&&s[cnt]=='#')cnt ;
int cun=cnt;
while(cnt<s.size()&&s[cun]==' ')cun ;
cout<<"<h"<<cnt<<'>'<<pr1(s.substr(cun,s.size()-cun))<<"</h"<<cnt<<'>'<<endl;
}
void f2(){
cout<<"<ul>"<<endl;
int tep=1;
while(tep<s.size()&&s[tep]==' ')tep ;
cout<<"<li>"<<pr1(s.substr(tep,s.size()-tep))<<"</li>"<<endl;
while(getline(cin,s)){
if(s=="")break;
if(s[0]=='#'){
cout<<"</ul>"<<endl;
f1();
return;
}
if(s[0]!='*'){
cout<<"</ul>"<<endl;
f3();
return;
}
int tep=1;
while(tep<s.size()&&s[tep]==' ')tep ;
cout<<"<li>"<<pr1(s.substr(tep,s.size()-tep))<<"</li>"<<endl;
}
cout<<"</ul>"<<endl;
}
void f3(){
cout<<"<p>"<<pr1(s);
while(getline(cin,s)){
if(s==""){
cout<<"</p>"<<endl;
return;
}
else if(s[0]=='#'){
cout<<"</p>"<<endl;
f1();
return;
}
else if(s[0]=='*'){
cout<<"</p>"<<endl;
f2();
return;
}
cout<<endl<<pr1(s);
}
cout<<"</p>"<<endl;
}
int main(){
while(getline(cin,s)){
if(s=="")continue;
if(s[0]=='#'){
f1();
}
else if(s[0]=='*'){
f2();
}
else if(s[0]!='#'&&s[0]!='*')f3();
}
}