满分代码
#include<bits/stdc++.h>
using namespace std;
string s;
// 处理超链接
string pr2(string s)
{
string ans;
for(int i=0;s[i];i++){
if(s[i]=='['){
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;
}
// 处理斜体
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;
}
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==""){
cout<<"</ul>"<<endl;
return;
}
int tep=1;
while(tep<s.size()&&s[tep]==' ')tep++;
cout<<"<li>"<<pr1(s.substr(tep,s.size()-tep))<<"</li>"<<endl;
}
}
void f3()
{
cout<<"<p>"<<pr1(s);
while(getline(cin,s)){
if(s==""){
cout<<"</p>"<<endl;
return;
}
cout<<endl<<pr1(s);
}
}
int main()
{
while(getline(cin,s)){
if(s=="")continue;
if(s[0]=='#') f1();
else if(s[0]=='*') f2();
else f3();
}
return 0;
}
20分代码(待解决)
#include<bits/stdc++.h>
using namespace std;
string s; // 每行输入的字符串
bool flag = true;
bool uflag,pflag;
// 处理斜体
void italic(int pos)
{
int p2 = s.find('_',pos+1);
string str = "<em>"+s.substr(pos+1,p2-pos-1)+"</em>";
s.replace(pos,p2-pos+1,str);
}
// 处理超链接
void flink(int t1)
{
int t2 = s.find(']',t1+1);
int a1 = s.find('('); // 链接左坐标
int a2 = s.find(')',a1+1); // 链接右坐标
string name = s.substr(t1+1,t2-t1-1);
string link = s.substr(a1+1,a2-a1-1);
string str = "<a href=\""+link+"\">"+name+"</a>";
s.replace(t1,a2-t1+1,str);
}
int main()
{
while(getline(cin,s)){ // 可以接受空行
// s不为空行
if(s!=""){
// 处理斜体
int pos = s.find('_');
while(pos!=string::npos){
italic(pos);
pos = s.find('_');
}
// 处理超链接
int t1 = s.find('[');
while(t1!=string::npos){
flink(t1);
t1 = s.find('[');
}
// 标题 #
if(s[0]=='#'){
int cnt=0; // 记录#个数
for(int i=0;i<s.size();i++){
if(s[i]=='#') cnt++;
else break;
}
int pos; // 记录标题第一个字符的位置
for(pos=cnt;pos<s.size();pos++){
if(s[pos]!=' ') break;
}
string str = s.substr(pos);
cout<<"<h"<<cnt<<">"<<str<<"</h"<<cnt<<">"<<endl;
}
// 无序列表
else if(s[0]=='*'){
uflag = true; // 结束时要加上</ul>
if(flag){ // 新的区块
cout<<"<ul>"<<endl;
flag = false;
}
int pos; // 记录标题第一个字符的位置
for(pos=1;pos<s.size();pos++){
if(s[pos]!=' ') break;
}
string str = s.substr(pos);
cout<<"<li>"<<str<<"</li>"<<endl;
}
else{ // 段落 <p> 开头
pflag = true; // 结束时要加上</p>
if(flag){ // 新的区块
cout<<"<p>"<<s;
flag = false;
}
else cout<<endl<<s;
}
flag = false; // 不为空行
}
// 输入一行空行:加入空行标记
else{
flag = true;
if(uflag){
cout<<"</ul>"<<endl;
uflag = false;
}
if(pflag){
cout<<"</p>"<<endl;
pflag = false;
}
}
}
return 0;
}