CCF-CSP题解 201703-3 Markdown
要求实现简易的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的更多相关文章
- CCF CSP 201703-3 Markdown
		CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ... 
- CCF CSP 201703
		CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ... 
- CCF CSP 201312-3 最大的矩形
		CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ... 
- CCF CSP 201609-3 炉石传说
		CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ... 
- CCF CSP 201403-3 命令行选项
		CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ... 
- CCF CSP 201709-4 通信网络
		CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ... 
- CCF CSP 201409-3 字符串匹配
		CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-3 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那 ... 
- CCF CSP 201503-3 节日
		CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-3 节日 问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形 ... 
- CCF CSP 201509-2 日期计算
		CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201509-2 日期计算 问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? ... 
- CCF CSP 201604-2 俄罗斯方块
		CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201604-2 俄罗斯方块 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游 ... 
随机推荐
- Leetcode 25/24 - Reverse Nodes in k-Group
			题目描述 Leetcode 24 题主要考察的链表的反转,而 25 题是 24 的拓展版,加上对递归的考察. 对题目做一下概述: 提供一个链表,给定一个正整数 k, 每 k 个节点一组进行翻转,最后返 ... 
- jdbc-mysql测试例子和源码详解
			目录 简介 什么是JDBC 几个重要的类 使用中的注意事项 使用例子 需求 工程环境 主要步骤 创建表 创建项目 引入依赖 编写jdbc.prperties 获得Connection对象 使用Conn ... 
- 经典算法之K近邻(回归部分)
			1.算法原理 1.分类和回归 分类模型和回归模型本质一样,分类模型是将回归模型的输出离散化. 一般来说,回归问题通常是用来预测一个值,如预测房价.未来的天气情况等等,例如一个产品的实际价格为500元, ... 
- HTML 创建按钮实现跳转链接
			1.使用 form<form method="get" action="/page2"> <button type="submit& ... 
- Java数组与C/C++数组的区别
			C数组一维数组: 定义方式:datatype arrayname[length]数组是一个整体,在内存中是连续的: 初始化:1:可以只给部分赋值int a[5] = {1,2}; 剩下的自动赋值为02 ... 
- 在开发Thinkphp5.0智慧软文个人微信个人支付宝企业支付宝接口时遇到的坑
			在开发Thinkphp5.0智慧软文个人微信个人支付宝企业支付宝接口时遇到回调后提示成功但是不能自动充值的情况,现在记录一下: 两种情况 1.个人支付宝 个人微信遇到的情况 因为个人支付宝 个人微信 ... 
- iNeuOS 工业互联网 从网关到云端一体化解决方案。教你如何做PPT。
			iNeuOS 专注打造云端操作系统,提供全新解决方案 (凑够150字) 核心组件包括:边缘网关(iNeuLink).设备容器(iNeuKernel).视图建模(iNeuView).机器 ... 
- nginx反向代理、负载均衡
			什么叫反向代理? A用户--> B(在和C同一个机房,并且有公网)--> C(不带公网的机器) 什么场景下会用到反向代理? 1.访问不带公网的内网机器 2.解决两台之间通信有障碍的问题 编 ... 
- luogu P2272 [ZJOI2007]最大半连通子图
			题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若 ... 
- NSUserdefaults清除存储内容
			有两种方式 方式一:找到所有的key,然后删除对象 /** * 清除所有的存储本地的数据 */ - (void)clearAllUserDefaultsData { NSUserDefaults * ... 
