CCF-CSP题解 201703-3 Markdown

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

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

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

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

#include <bits/stdc++.h>

using namespace std;

void print_buf(char buf[])
{
    for (int i = 0; buf[i] != ''; 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] = '';
            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] = '';
            i = j + 1;
            j = i + 1;
            for (; buf[j] != ')'; j++);
            strcpy(link, buf + i + 1);
            link[j-i-1] = '';
            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] == '
')
        {
            if (tmpblk == 2)
                printf("</ul>
");
            else if (tmpblk == 0)
            {
                printf("</p>
");
            }
            tmpblk = -1;
        }
        else
        {
            buf[strlen(buf)-1] = '';
            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>
", h_num);
            }
            else if (buf[0] == '*')
            {
                if (tmpblk == 2)
                {
                    int i = 1;
                    for (; buf[i] == ' '; i++);
                    printf("<li>");
                    print_buf(buf + i);
                    printf("</li>
");
                }
                else
                {
                    tmpblk = 2;
                    int i = 1;
                    for (; buf[i] == ' '; i++);
                    printf("<ul>
");
                    printf("<li>");
                    print_buf(buf + i);
                    printf("</li>
");
                }
            }
            else
            {
                if (tmpblk == 0)
                {
                    printf("
");
                    print_buf(buf);
                }
                else
                {
                    tmpblk = 0;
                    printf("<p>");
                    print_buf(buf);
                }
            }
        }
    }

    if (tmpblk == 2)
        printf("</ul>
");
    else if (tmpblk == 0)
    {
        printf("</p>
");
    }

    return 0;
}
原文地址:https://www.cnblogs.com/acboyty/p/11372051.html