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 

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("");
            print_buf(tmp_buf);
            printf("");
            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("");
            print_buf(text);
            printf("");
            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("\n");
            else if (tmpblk == 0)
            {
                printf("

\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_num); print_buf(buf + i); printf("\n", h_num); } else if (buf[0] == '*') { if (tmpblk == 2) { int i = 1; for (; buf[i] == ' '; i++); printf("
  • "); print_buf(buf + i); printf("
  • \n"); } else { tmpblk = 2; int i = 1; for (; buf[i] == ' '; i++); printf("
      \n"); printf("
    • "); print_buf(buf + i); printf("
    • \n"); } } else { if (tmpblk == 0) { printf("\n"); print_buf(buf); } else { tmpblk = 0; printf("

      "); print_buf(buf); } } } } if (tmpblk == 2) printf("

    \n"); else if (tmpblk == 0) { printf("

    \n"); } return 0; }

    转载于:https://www.cnblogs.com/acboyty/p/11372051.html

    你可能感兴趣的:(CCF-CSP题解 201703-3 Markdown)