AcWing 3244. Markdown-csp10(3)
原题链接
中等
作者:
YAX_AC
,
2024-11-20 18:22:26
,
所有人可见
,
阅读 3
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
vector<string> strs;
int work_link(string str,int i)
{
string text,link;
//i++;过滤掉第一个[
for(i++; str[i] != ']'; i++)
{
char c = str[i];
if(c == '_')//处理强调,不能调用函数,第二个函数直接输出了,这个需要存在string里面
{
text += "<em>";
i++;//过滤掉第一个_
while(str[i] != '_') text += str[i++];
text += "</em>";
//i++;//过滤掉第二个_不需要写,因为上面for有i++可以过滤掉
}
else text += c;
}
//i+=2;跳过一个中括号还有一个小括号
for(i+=2; str[i] != ')'; i++) link += str[i];
printf("<a href=\"%s\">%s</a>",link.c_str(),text.c_str());
return i;
}
int work_em(string str,int i)
{
printf("<em>");
//i++将第一个下划线跳过
for(i++; str[i]!='_'; i++)
{
char c = str[i];
if(c=='[') i = work_link(str,i);//处理链接
else cout<<c;
}
printf("</em>");
return i;
}
void work_line(string str)//处理每一行
{
int k = 0;
while(str[k] == ' ') k++;
str = str.substr(k);//将行首的多余空格删掉,即截取空格之后的字符串
for(int i = 0; i<str.size(); i++)
{
char c = str[i];
if(c == '_') i = work_em(str,i);//处理强调
else if(c == '[') i = work_link(str,i);//处理链接
else cout<<c;
}
}
void work(int a,int b)
{
if(strs[a][0] == '#')//是标题
{
int k = 0;
while(strs[a][k] == '#') k++;
//k:#个数
printf("<h%d>",k);//一个#,h1,两个#h2,三个#h3
work_line(strs[a].substr(k));//处理一行
printf("</h%d>\n",k);
}
else if(strs[a][0] == '*')//处理序列
{
printf("<ul>\n");
for(int i = a; i<=b; i++)//列表中的每一项
{
printf("<li>");
work_line(strs[i].substr(1));
printf("</li>\n");
}
printf("</ul>\n");
}
else//段落
{
printf("<p>");
for(int i = a; i<=b; i++)
{
work_line(strs[i]);
if(i!=b)//如果不是最后一行的话
cout<<endl;
}
printf("</p>\n");
}
}
int main()
{
string str;
while(getline(cin,str)) strs.push_back(str);
for(int i = 0; i<strs.size(); i++)
{
if(strs[i].empty()) continue;//是空的话直接过滤掉
int j = i+1;
//找出连续的一段非空行
while(j<strs.size() && strs[j].size()) j++;
work(i,j-1);//处理这一段段落
i = j-1;
}
return 0;
}