这是我做过的最简单的第三题, 一遍就过了. 按照题目要求的进行字符串转换即可.
要是今年九月份的CCF认证有这么简单就好了.
既然分了区块和行内两种层次, 那么首先应该划分区块,然后对区块的内容分别处理
- 先进行区块划分
输入文本里的空行应该是”“, 空字符, 也没有换行表示什么的. - 用一个函数分别对每个区块进行解析
- 处理段落
- 处理标题, 注意字符串拼接, 还是一个一个接比较好.
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
void em (string &line)
{
string tmp = "";
int cnt = 0;
for (int i = 0; i < line.size(); ++i) {
if (line[i] == '_') {
cnt++;
if (cnt % 2 == 1) {
tmp += "<em>";
} else tmp += "</em>";
} else tmp += line[i];
}
line = tmp;
}
string turn(string content)
{
string tmp = "<a href=\"";
int i;
for (i = 0; content[i] != '('; ++i) ;
++i;
while (content[i] != ')') {
tmp += content[i];
i++;
}
tmp += "\">";
for (i = 1; content[i] != ']'; ++i) tmp += content[i];
tmp += "</a>";
return tmp;
}
void href (string &line)
{
string tmp, temp;
bool on = false;
for (int i = 0; i < line.size(); ++i) {
if (line[i] == '[') on = true;
if (on) tmp += line[i];
else temp += line[i];
if (line[i] == ')') {
on = false;
temp += turn(tmp);
tmp = "";
}
}
line = temp;
}
void transfer(vector<string> &block)
{
if (block[0][0] == '#') {
for (int i = 0; i < block.size(); ++i) {
int j, cnt = 0;
for (j = 0; block[i][j] == '#'; ++j) {
cnt++;
}
string tmp = "<h";
tmp += char(cnt + '0');
tmp += '>';
while (block[i][j] == ' ') ++j;
for (int k = j; k < block[i].size(); ++k)
tmp += block[i][k];
tmp += "</h";
tmp += char(cnt + '0');
tmp += '>';
em(tmp);
href(tmp);
block[i] = tmp;
}
} else if (block[0][0] == '*') {
for (int i = 0; i < block.size(); ++i) {
while (block[i][0] == ' ' || block[i][0] == '*') block[i].erase(block[i].begin());
}
block[0] = "<ul>\n<li>" + block[0] + "</li>";
for (int i = 1; i < block.size(); ++i) {
block[i] = "<li>" + block[i] + "</li>";
}
block.back() += "\n</ul>";
for (int i = 0; i < block.size(); ++i) {
em(block[i]);
href(block[i]);
}
} else {
block[0] = "<p>" + block[0];
block.back() += "</p>";
for (int i = 0; i < block.size(); ++i) {
em(block[i]);
href(block[i]);
}
}
}
void show(vector<string> blocks[105], int id)
{
for (int i = 0; i <= id; ++i) {
for (int j = 0; j < blocks[i].size(); ++j) {
cout << blocks[i][j] << endl;
}
}
}
int main()
{
string line, last;
bool isfirst = false;
vector<string> blocks[105];
int id = 0;
while (getline(cin, line)) {
if (isfirst == false) {
if (line != "") {
isfirst = true;
blocks[id].push_back(line);
}
} else {
if (line != "" && last == "") {
blocks[++id].push_back(line);
} else if (line != "") blocks[id].push_back(line);
}
last = line;
}
for (int i = 0; i <= id; ++i) {
transfer(blocks[i]);
}
show(blocks, id);
}