CCF201703-3 Markdown

#include<bits/stdc++.h>
using namespace std;

//一个区块一个区块地处理 
//标题和无序列表比较特殊,它们在首个字符特征显著且除它们之外,其他都当段落处理 
void solve(string lines)
{
	//处理下划线,标签<em></em>
	//size_t是unsigned int
	size_t leftp = lines.find("_"); //返回字符_在字符串中第一次出现的位置,如果没有找到则返回string::npos
	while(leftp != string::npos)
	{
		lines.replace(leftp, 1, "<em>"); //用"<em>"替代lines中的1个字符(从leftp开始)
		//要先替换后再找,不然下标会不对 
		size_t rightp = lines.find("_", leftp+1); //起始位置 
		lines.replace(rightp, 1, "</em>");
		leftp = lines.find("_", rightp+1);
	}
	
	//处理方括号
	leftp = lines.find("[");
	while(leftp != string::npos)
	{
		size_t rightp = lines.find("]", leftp+1);
		size_t leftp2 = lines.find("(", rightp+1);
		size_t rightp2 = lines.find(")", leftp2+1);
		string tmp1 = lines.substr(leftp+1, rightp-leftp-1); //分别为起始位置和长度
		string tmp2 = lines.substr(leftp2+1, rightp2-leftp2-1);
		// basic_string &replace( iterator start, iterator end, const basic_string &str );
		lines.replace(lines.begin()+leftp, lines.begin()+rightp2+1, "<a href=\"" + tmp2 + "\">" + tmp1 +"</a>"); //[leftp,rightp2]
		leftp = lines.find("[", rightp2+1);
	}
	
	//处理#标签,<h></h>
	if(lines[0]=='#')
	{
		int i=1;
		while(lines[i]=='#') i++;
		int j = i;
		while(lines[j]==' ') j++;
		//substr()返回本字符串的一个子串,从index开始,长num个字符,如果没有指定,将是默认值 string::npos。
		//这样,substr()函数将简单的返回从index开始的剩余的字符串。
		lines = "<h" + string(1, '0'+i) + ">" + lines.substr(j); 
		lines.insert(lines.size()-1, "</h" + string(1, '0'+i) + ">"); //不用"+="是因为lines最后一个字符是"\n" 
	}
	//处理*,标签<ul><li></li>......</ul>
	else if(lines[0]=='*') 
	{
		leftp = 0;
		while(leftp!=string::npos)
		{
			int i=leftp+1;
			while(lines[i]==' ') i++;
			size_t rightp = lines.find("\n", i);
			//先插入在替代,因为要处理下标是后面,要处理前面的会导致后面的下标不正确 
			lines.insert(rightp, "</li>");
			lines.replace(leftp, i-leftp, "<li>");
			leftp = lines.find("*", rightp+1);	
		}
		lines.insert(0, "<ul>\n");
		lines.insert(lines.size(), "</ul>\n"); 
	}
	//处理段落 
	else
	{
		lines = "<p>" + lines.substr(0, lines.size()-1) + "</p>\n"; //长度减1是因为最后一个字符是换行符 
	}
	cout<<lines;
}

int main()
{
	std::string line, lines="";
	//getline函数:从istream中读取一行数据,当遇到“\n”时结束返回,但cin不会主动删除输入流内的换行符
	//不用cin.ignore() 因为文本中会有多个换行符 
    std::getline(std::cin, line);
    bool flag = false;
	while(1)
	{
		if(line.size()>0) lines += line + "\n";
		else if(line.size()==0 && lines.size()>0) //line.size()==0表示空行 
		{
			solve(lines);
			lines = "";
		}
		if(flag) break;
		if(!getline(cin, line)) flag = true; 
	}
	return 0;
}
/*
# Heading

## Sub-heading

Paragraphs are separated
by a blank line.

text attributes _italic_.

Bullet list:

*  apples
*  oranges
*  pears

A [link](http://example.com).
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值