要求实现简易的Markdown到Html格式的转换。

主要就是字符串处理。以空行划分各个区块,区块内部字符的输出用一个\(print\_buf\)实现,至于强调和超链接的嵌套,则可以递归实现。

注意用scanf % ^\n & getchar实现,输入空行的时候,这个函数匹配不到字符,是不起作用的。也就是说,\(buf[]\)保持原样,不会变成"",buf[0]也不会是'\0'。所以判断空行需要从scanf的返回值入手。scanf返回值是成功匹配的个数,所以空行时它的返回值是0,非空时返回值为1,输入结束时返回值为-1(EOF)。

有空行的情况或者输入庞大的时候,可以使用fgets buf buf_sz stdin函数。这个函数会把换行符也读入字符串中,所以判断空行只需判断buf[0]是否是'\n'即可。后续字符串处理的时候还是把'\n''换成'\0'会比较好。

#include <bits/stdc++.h>

using namespace std;

void print_buf(char buf[])
{
for (int i = 0; buf[i] != '\0'; i++)
{
if (buf[i] == '_')
{
int j = i + 1;
for (; buf[j] != '_'; j++);
char tmp_buf[105];
strcpy(tmp_buf, buf + i + 1);
tmp_buf[j-i-1] = '\0';
printf("<em>");
print_buf(tmp_buf);
printf("</em>");
i = j;
}
else if (buf[i] == '[')
{
char text[105], link[105];
int j = i + 1;
for (; buf[j] != ']'; j++);
strcpy(text, buf + i + 1);
text[j-i-1] = '\0';
i = j + 1;
j = i + 1;
for (; buf[j] != ')'; j++);
strcpy(link, buf + i + 1);
link[j-i-1] = '\0';
printf("<a href=\"");
print_buf(link);
printf("\">");
print_buf(text);
printf("</a>");
i = j;
}
else
{
printf("%c", buf[i]);
}
}
} int main()
{
char buf[105];
int tmpblk = -1; // 0 p 1 h 2 ul
while (fgets(buf, 105, stdin) != NULL)
{
if (buf[0] == '\n')
{
if (tmpblk == 2)
printf("</ul>\n");
else if (tmpblk == 0)
{
printf("</p>\n");
}
tmpblk = -1;
}
else
{
buf[strlen(buf)-1] = '\0';
if (buf[0] == '#')
{
tmpblk = 1;
int h_num = 0;
int i = 0;
for (; buf[i] == '#'; i++)
h_num++;
for (; buf[i] == ' '; i++);
printf("<h%d>", h_num);
print_buf(buf + i);
printf("</h%d>\n", h_num);
}
else if (buf[0] == '*')
{
if (tmpblk == 2)
{
int i = 1;
for (; buf[i] == ' '; i++);
printf("<li>");
print_buf(buf + i);
printf("</li>\n");
}
else
{
tmpblk = 2;
int i = 1;
for (; buf[i] == ' '; i++);
printf("<ul>\n");
printf("<li>");
print_buf(buf + i);
printf("</li>\n");
}
}
else
{
if (tmpblk == 0)
{
printf("\n");
print_buf(buf);
}
else
{
tmpblk = 0;
printf("<p>");
print_buf(buf);
}
}
}
} if (tmpblk == 2)
printf("</ul>\n");
else if (tmpblk == 0)
{
printf("</p>\n");
} return 0;
}

CCF-CSP题解 201703-3 Markdown的更多相关文章

  1. CCF CSP 201703-3 Markdown

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...

  2. CCF CSP 201703

    CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ...

  3. CCF CSP 201312-3 最大的矩形

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...

  4. CCF CSP 201609-3 炉石传说

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...

  5. CCF CSP 201403-3 命令行选项

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...

  6. CCF CSP 201709-4 通信网络

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...

  7. CCF CSP 201409-3 字符串匹配

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-3 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那 ...

  8. CCF CSP 201503-3 节日

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-3 节日 问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形 ...

  9. CCF CSP 201509-2 日期计算

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201509-2 日期计算 问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? ...

  10. CCF CSP 201604-2 俄罗斯方块

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201604-2 俄罗斯方块 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游 ...

随机推荐

  1. shodan 文档学习笔记

    Table of Contents 1. Introduction 1.1. All About the Data 1.2. Data Collection 1.3. SSL in Depth 1.3 ...

  2. win10中java环境变量配置

    首先,应该安装jdk,jdk的安装一般是jdk8,一般情况下去官网下载,此处有jdk8的网盘链接: -- 在安装jdk时候,可以看下这篇jdk和jre区别的博客--,有助于理解两者的区别和联系. 接触 ...

  3. 以太网驱动的流程浅析(一)-Ifconfig主要流程【原创】

    以太网驱动的流程浅析(一)-Ifconfig主要流程 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号以及<Lin ...

  4. nvidia gtx1050在kali linux系统下安装显卡驱动,且可以使用x-setting切换显卡

    转自:https://www.zzhsec.com/255.html 1.更换源[使用中科大或者官方源都可以] 下面使用中科大的源 root@Andy:/home/dnt# vi /etc/apt/s ...

  5. 题解 P2669 【金币】

    似乎我这个"蒟蒻"跟各位DALAO想的不太一样 首先,输入n,使用一层循环搞定 具体思路: 使用ans作为累加器,k记录发几枚金币,s负责不断赋值给累加器,sum当这些天数的金币发 ...

  6. [从今天开始修炼数据结构]串、KMP模式匹配算法

    [从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈.斐波那契数列.逆波兰四则运 ...

  7. 限定某个目录禁止解析php、限制user_agent、php相关配置

    6月1日任务 11.28 限定某个目录禁止解析php11.29 限制user_agent11.30/11.31 php相关配置扩展apache开启压缩 http://ask.apelearn.com/ ...

  8. 在Spring Boot中添加全局异常捕捉提示

    在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 全局异常捕捉: 新建一个类GlobalDefaultExceptionHandler, 在class注解上@Controll ...

  9. IDEA IntelliJ/ DataGrip 修改自动补全快捷键

    系统默认的是Tab键,个人喜欢用空格键作为自动补全键,设置方法如下 Setting-->Keymap-->Editor Actions:Choose Lookup Item Replace ...

  10. python画樱花

    用python画简单的樱花 代码如下: import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, t): ...