第一个坑点是数据全部读入之后应该在程序的末尾输出最后一组数据,因为如果不这样的话会少输出最后那组数据的处理结果,导致结果错误;第二个坑点是在处理超链接和强调的时候,下标的初值不应该置为0,因为如果这行数据下标为0的部分就是’_‘或者’['的话,这样会导致处理部分出错。
#include <iostream>
#include <algorithm>
#include <string>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <stack>
#include <unordered_map>
#include <vector>
using namespace std;
int main()
{
std::string line;
vector<string> p;
int flag1 = 0, flag2 = 0;
while(std::getline(std::cin, line))
{
int pos1 = -1, pos2 = 0, pos3 = -1, pos4 = 0;
string mid = "", link = "";
for(int i = 0 ; i < line.length() ; ++i) //处理强调
{
if(line[i] == '_' && pos1 == -1)
{
//cout<<i<<endl;
pos1 = i;
}
else if(line[i] == '_' && pos2 == 0)
{
pos2 = i;
mid = "<em>" + mid + "</em>";
line.replace(pos1, pos2 - pos1 + 1, mid);
//cout<<pos1<<" "<<line<<" "<<pos2<<endl;
mid = "";
pos2 = 0;
pos1 = -1;
}
else if(line[i] != '_' && pos1 != -1)
{
mid += line[i];
}
}
pos1 = -1;
pos2 = 0;
mid = "";
int st = 0;
for(int i = 0 ; i < line.length() ; ++i) //处理超链接
{
if(line[i] == '[' && pos1 == -1)
{
pos1 = i;
}
else if(line[i] == ']' && pos2 == 0)
{
pos2 = i;
st = pos1;
pos1 = -1;
//cout<<pos1<<" "<<line<<" "<<pos2<<endl;
}
else if(line[i] == '(' && pos3 == -1)
{
pos3 = i;
}
else if(line[i] == ')' && pos4 == 0)
{
pos4 = i;
link = "<a href=\"" + link + "\">" + mid + "</a>";
line.replace(st, pos4 - st + 1, link);
// cout<<st<<" "<<line<<" "<<pos4<<endl;
link = "";
mid = "";
pos1 = -1;
pos2 = 0;
pos3 = -1;
pos4 = 0;
}
else if(pos1 != -1)
{
mid += line[i];
}
else if(pos3 != -1)
{
link += line[i];
}
}
if(line[0] == '#')
{
int cnt = 1, cnt1 = 0;
for(int i = 1 ; i < line.length() ; ++i)
{
cnt1++;
if(line[i] == '#')
{
cnt++;
}
else if(line[i] != '#' && line[i] != ' ')
break;
}
string c1;
char c = cnt + '0';
c1 = c1 + "<h" + c + ">";
line.replace(0, cnt1, c1);
line = line + "</h" + c + ">";
}
else if(line[0] == '*')
{
if(!flag1)
cout<<"<ul>"<<endl;
flag1++;
int i;
for(i = 1 ; i < line.length() ; ++i)
{
if(line[i] == ' ')
continue;
else
break;
}
string c1, c2;
c1 = "<li>";
c2 = "</li>";
line = line.replace(0, i, c1);
line += c2;
}
else if(line == "")
{
if(flag1)
{
cout<<"</ul>"<<endl;
flag1 = 0;
}
}
else
{
if(!flag2)
line = "<p>" + line;
p.push_back(line);
flag2++;
}
if(line == "" && flag2)
{
//cout<<p.size()<<endl;
for(int i = 0 ; i < p.size() ; ++i)
{
if(i == p.size() - 1)
cout<<p[i]<<"</p>"<<endl;
else
cout<<p[i]<<endl;
}
p.clear();
flag2 = 0;
}
else if(!flag2 && line != "")
cout<<line<<endl;
}
for(int i = 0 ; i < p.size() ; ++i)
{
if(i == p.size() - 1)
cout<<p[i]<<"</p>"<<endl;
else
cout<<p[i]<<endl;
}
if(flag1)
{
cout<<"</ul>"<<endl;
flag1 = 0;
}
if(!flag2)
cout<<line<<endl;
}