1.解题思路
这道题真的很考验细节!!主体分空行、标题、无序列表和段落这几种情况,而其中内容又可能存在超链接和强调的情况(且存在嵌套的情况),需按照各自情况进行处理,对于段落和无序列表的首尾标签的添加可以用两个变量指示,如f1=false时添加<ul>,f1=true时添加</ul>.
2.满分代码
#include<bits/stdc++.h>
using namespace std;
int work1(string &res,string &str,int i);
int work2(string &res,string &str,int i);
int work1(string &res,string &str,int i)//处理超链接
{
res+="<a href=\"";
int j=i;
while(str[i]!='(')i++;
for(i++;str[i]!=')';i++)
{
if(str[i]=='_')
i=work2(res,str,i);
else
res+=str[i];
}
res+="\">";
int k=i;
i=j;
for(i++;str[i]!=']';i++)
{
if(str[i]=='_')
i=work2(res,str,i);
else
res+=str[i];
}
res+="</a>";
return k;
}
int work2(string &res,string &str,int i)//处理强调
{
res+="<em>";
for(i++;str[i]!='_';i++)
{
if(str[i]=='[')
i=work1(res,str,i);
else
res+=str[i];
}
res+="</em>";
return i;
}
int main()
{
string res,str;
bool f1=false,f2=false;
while(getline(cin,str))
{
if(str.size()==0)//空行
{
if(f1==true)
{
res+="</ul>";
res+='\n';
f1=false;
}
if(f2==true)
{
res+="</p>";
res+='\n';
f2=false;
}
continue;
}
if(str[0]=='#')//标题
{
res+="<h";
int num=0,i;
for(i=0;str[i]=='#';i++)num++;
res+=(num+'0');
res+='>';
while(str[i]==' ')i++;
for(;str[i];i++)
{
if(str[i]=='[')
i=work1(res,str,i);
else if(str[i]=='_')
i=work2(res,str,i);
else
res+=str[i];
}
res+="</h";
res+=(num+'0');
res+='>';
res+='\n';
}
else if(str[0]=='*')//无序列表
{
if(f1==false)
{
res+="<ul>";
res+='\n';
}
f1=true;
res+="<li>";
int i=1;
while(str[i]==' ')i++;
for(;str[i];i++)
{
if(str[i]=='[')
i=work1(res,str,i);
else if(str[i]=='_')
i=work2(res,str,i);
else
res+=str[i];
}
res+="</li>";
res+='\n';
}
else//段落
{
if(f2==false)
res+="<p>";
if(f2==true)
res+='\n';
f2=true;
for(int i=0;str[i];i++)
{
if(str[i]=='[')
i=work1(res,str,i);
else if(str[i]=='_')
i=work2(res,str,i);
else
res+=str[i];
}
}
}
if(f1==true)
{
f1=false;
res+="</ul>";
res+='\n';
}
if(f2==true)
{
f2=false;
res+="</p>";
res+='\n';
}
cout<<res;
return 0;
}