CCF认证 201703-3Markdown

在这里插入图片描述

第一个坑点是数据全部读入之后应该在程序的末尾输出最后一组数据,因为如果不这样的话会少输出最后那组数据的处理结果,导致结果错误;第二个坑点是在处理超链接和强调的时候,下标的初值不应该置为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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值